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)