Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 4 Nächste Version anzeigen »

Möchte man verhindern, dass bestimmte Regeln ausgeführt werden, kann man dies mithilfe regelübergreifender (ThreadLocal) Variablen erreichen.

Ein typischer Anwendungsfall dafür ist die gezielte Aktualisierung einzelner Felder in Businessobjekten aus einer Regel hinaus, bei der man z.B. aus Performancegründen oder um Endlosschleifen durch sich gegenseitig aktualiserende Regeln bzw. Businessobjekte zu vermeiden, verhindern will, dass die Speichernregeln (UpdateRule, UpdateFinalRule) des zu aktualisierenden Businessobjektes ausgeführt werden. Natürlich ist bei Einsatz der im Folgenden beschriebenen Methode darauf zu achten, dass man die fachliche Logik der Regeln nicht aushebelt, es ist also mit Bedacht vorzugehen.

Einführung einer ThreadLocal-Variable in der zu deaktivierenden Regel

Zu deaktivierende Regel
public class MyUpdateRule implements UpdateRule, StateChangeFinalRule {

    public static final ThreadLocal<Boolean> ACTIVE = new ThreadLocal<Boolean>() {
        protected Boolean initialValue() {return Boolean.TRUE;};
    };

    public void update(UpdateContext context) throws BusinessException { 
        if (ACTIVE.get()) {
            MyBusinessObject mbo = context.getBusinessObject(MyBusinessObject.class);
			...
        }
    }
}

ThreadLocal-Variablen sind lokal auf den Thread bezogen, dass heisst die Deaktivierung einer Regel bezieht sich immer nur auf den aktuellen Thread bzw. Benutzerkontext. Die Regel wird also nicht generell deaktiviert, wie z.B. über das Aktiv-Flag der Regel.

Deaktivierung aus aktualisierender (anderer) Regel heraus

Deaktivierende Regel
 

Es ist unbedingt darauf zu achten, dass die Deaktivierung zuverlässig wieder zurückgesetzt wird (auch im Fehlerfall), daher sollte diese immer wie in diesem Beispiel im finally-Block geschehen.

 

 

  • Keine Stichwörter