Questions & Answers

aVogt
Returning Creator

Medium mit Arbeitsablauf freigeben

Hallo,

ich habe fรผr die Redakteure einen Arbeitsablauf zur Freigabe eines Mediums erstellt.

Der funktioniert auch (Medium wird freigegeben) nur bekomme  ich am Ende des Arbeitsablaufs eine Fehlermeldung

Error creating task - java.lang.IllegalStateException: node not locked

genaue Meldung -> mldg.txt

Script zur Freigabe:

medium = context.getStoreElement();
mediumID = medium.getUid();
if(!medium.isLocked()) {
  medium.setLock(true);
}
medium.release();
medium.setLock(false);
context.logInfo("======= ENDE: Freigabe Medium",);
context.doTransition("frg_ok");

Den รœbergang "frg_ok" gibt es und ich hab auch die notwendigen Rechte.

Der Fehler muss nach der letzten zeile auftreten (wenn ich nach den ..doTrasistion... eine Logausgabe angebe, weird diese noch ausgegeben und danach tritt der Fehler auf.

Woran liegt es, dass dieser Fehler auftritt (was sagt er mir eigentlich) und wie kann ich ihn beheben?

3 Replies
hoebbel
Crownpeak employee

Der Fehler besagt, dass das Objekt nicht im Bearbeitungsmodus war.

Statt den Bearbeitungsmodus fรผr das Medium grundsรคtzlich zu beenden:

medium.setLock(false);

wรคre es korrekter, den Bearbeitungsstatus des Mediums zwischenzuspeichern und den Bearbeitungsmodus nur zu beenden wenn das Medium nicht darin war. [Oder in diesem Fall das Beenden des Bearbeitungsmodus einfach dem Workflow zu รผberlassen Smiley Wink. Der Fehler fliegt, wenn der Workflow nach dem weiterschalten den Bearbeitungsmodus beenden will]


0 Kudos
aVogt
Returning Creator

aha, Danke fรผr die Info. Nun funktionierts .

bm = medium.isLocked();
if(!bm) {
  medium.setLock(true);
}
medium.release();
if(!bm) {
  medium.setLock(false);
}

0 Kudos
gockel
Crownpeak employee

Genereller Hinweis zum Setzen von Locks รผber die API.

1. Locks sollten immer im try / finally block stehen

2. Es sollten "immer" nicht rekursive Locks gesetzt werden.

boolean wasLocked = medium.isLocked();

try {

     if ( ! wasLocked) {

          medium.setLock(true, false); // lock non-recursive

     }

     medium.release(false);     // non recursive release

} catch(LockException lockFailed) {

     context.logError("lock failed -> medium already locked by " + lockFailed.getUserLoginName());

} finally {

     try {

          if ( ! wasLocked) {

               medium.setLock(false, false);     // unlock non-recursive

          }

     } catch(Exception unlockFailed){

          // proper error handling

     }

}

zu 1.)

Der try/finally Block stellt sicher, dass das Objekt (in diesem Fall das Medium) auch im Fall eines Fehlers wieder entsperrt wird. Ansonsten bleibt das Objekt auf dem Server fรผr die Dauer der Session mit der der Lock gesetzt wurde, erhalten. Das kann bei einem Skript auf dem Server mitunter fรผr die gesamte Laufzeit des FirstSpirit Servers sein.

zu 2.)

Da es sich in diesem Fall um ein Medium handelt, wรผrde ein rekursiver Lock den gleichen Effekt haben wie der nicht rekursive Lock. Man sollte sich allerdings angewรถhnen immer "nicht-rekursive" Locks zu verwenden, auรŸer man benรถtigt explizit einen "rekurisven" Lock (z.B. bei Page)

Type a product name