<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Einführung
Erstellen Sie Zustandsmaschinen und leichtgewichtige zustandsmaschinenbasierte Workflows direkt in Java-Code.
StateMachineConfig<State, Trigger> phoneCallConfig = new StateMachineConfig<>();phoneCallConfig.configure(State.OffHook) .permit(Trigger.CallDialed, State.Ringing);phoneCallConfig.configure(State.Ringing) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.CallConnected, State.Connected);// this example uses Java 8 method references// a Java 7 example is provided in /examplesphoneCallConfig.configure(State.Connected) .onEntry(this::startCallTimer) .onExit(this::stopCallTimer) .permit(Trigger.LeftMessage, State.OffHook) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PlacedOnHold, State.OnHold);// ...StateMachine<State, Trigger> phoneCall = new StateMachine<>(State.OffHook, phoneCallConfig);phoneCall.fire(Trigger.CallDialed);assertEquals(State.Ringing, phoneCall.getState());
stateless4j ist ein Port von stateless für Java
Eigenschaften
Die meisten Standard-Zustandsmaschinenkonstrukte werden unterstützt:
- Generische Unterstützung für Zustände und Trigger eines beliebigen Java-Typs (Zahlen, Zeichenfolgen, Aufzählungen usw.)
- Hierarchische Zustände
- Ein- /Ausstiegsereignisse für Zustände
- Guard-Klauseln zur Unterstützung bedingter Übergänge
- Benutzerdefinierte Aktionen können beim Übergang ausgeführt werden
- Interne Übergänge
onExit
/onEntry
) - Introspektion
Einige nützliche Erweiterungen werden ebenfalls bereitgestellt:
- Parametrisierte Trigger
- Wiedereintrittszustände
Hierarchische Zustände
Im folgenden Beispiel ist der Zustand OnHold
ein Unterzustand des Zustands Connected
. Dies bedeutet, dass ein OnHold
-Aufruf immer noch verbunden ist.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
Zusätzlich zur StateMachine.getState()
-Eigenschaft, die den genauen aktuellen Status meldet, wird eine isInState(State)
-Methode bereitgestellt. isInState(State)
berücksichtigt Unterzustände, so dass, wenn das obige Beispiel im ZustandOnHold
wäre, isInState(State.Connected)
auch zu true
ausgewertet würde.
Entry/Exit Events
Im Beispiel wird die startCallTimer()
-Methode ausgeführt, wenn ein Anruf verbunden wird. Der stopCallTimer()
wird ausgeführt, wenn der Anruf abgeschlossen ist (entweder durch Auflegen oder Schleudern des Telefons gegen die Wand.)
Der Aufruf kann zwischen den Zuständen Connected
und OnHold
wechseln, ohne dass die Methoden startCallTimer(
) und stopCallTimer()
wiederholt aufgerufen werden, da der Zustand OnHold
ein Unterzustand des Zustands Connected
ist.
Ein- /Ausstiegsereignishandler können mit einem Parameter vom Typ Transition
geliefert werden, der die Trigger-, Quell- und Zielzustände beschreibt.
Aktion beim Übergang
Beim Übergang kann eine benutzerdefinierte Aktion ausgeführt werden.Für einen ’normalen‘ oder ‚wiedereintretenden‘ Übergang wird diese Aktion ohne Parameter aufgerufen. Für ‚dynamische‘ Übergänge (diejenigen, die den Zielstatus basierend auf Trigger-gegebenen Parametern berechnen) werden die Parameter des Auslösers an die Aktion übergeben.
Diese Aktion wird nur ausgeführt, wenn der Übergang tatsächlich erfolgt ist; Wenn also der Übergang bewacht ist und der Wächter einen Übergang verbietet, wird die Aktion nicht ausgeführt.
Wenn der Übergang erfolgt ist, wird die Aktion zwischen dem onExit
-Handler des aktuellen Status und dem onEntry
-Handler des Zielstatus ausgeführt (dies kann im Falle einer Re-entranttransition derselbe Status sein.
Lizenz
Apache 2.0 Lizenz
Erstellt von @oxo42
Gepflegt von Chris Narkiewicz @ezaquarii