stateless4j / stateless4j

 <dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>

 Build-Status

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.