<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Inleiding
maak statuscomputers en lichtgewicht statuscomputergebaseerde workflows direct 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 is een poort van stateless voor java
Features
de meeste standaard staat machineconstructies worden ondersteund:
- Generieke ondersteuning voor staten en triggers van elk java-type (nummers, strings, enums, enz.)
- Hiërarchische staten
- Entry/exit-evenementen voor de staten
- Guard bepalingen ter ondersteuning van voorwaardelijke overgangen
- door de Gebruiker gedefinieerd acties kunnen worden uitgevoerd bij het overstappen
- Interne overgangen (niet te bellen
onExit
/onEntry
) - Introspectie
Enkele handige extensies zijn ook aanwezig:
- Geparametriseerd triggers
- Inspringende staten
Hiërarchische Staten
In het voorbeeld hieronder, de OnHold
staat is een substate van de Connected
staat. Dit betekent dat een OnHold
gesprek nog steeds verbonden is.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
naast de eigenschap StateMachine.getState()
, die de precieze huidige toestand zal rapporteren, wordt een methode isInState(State)
gegeven. isInState(State)
houdt rekening met substaten, zodat als het bovenstaande voorbeeld zich in de toestandOnHold
bevond, isInState(State.Connected)
ook tot true
zou worden beoordeeld.
Entry/Exit Events
in het voorbeeld wordt de startCallTimer()
methode uitgevoerd wanneer een aanroep wordt verbonden. De stopCallTimer()
wordt uitgevoerd wanneer het gesprek is voltooid (door de telefoon op te hangen of tegen de muur te gooien.)
de aanroep kan tussen de Connected
en OnHold
toestanden bewegen zonder dat de startCallTimer(
) en stopCallTimer()
methoden herhaaldelijk worden aangeroepen omdat de OnHold
toestand een substaat is van de Connected
toestand.
Entry/Exit event handlers kunnen worden geleverd met een parameter van het type Transition
die de trigger -, bron-en doeltoestanden beschrijft.
actie bij overgang
het is mogelijk om een door de gebruiker gedefinieerde actie uit te voeren bij het uitvoeren van een overgang.Voor een’ normale ‘of’ re-entrant ‘ overgang zal deze actie zonder parameters worden genoemd. Voor ‘dynamische’ overgangen (degenen die de doeltoestand berekenen op basis van trigger-gegeven parameters) zullen de parameters van de trigger aan de actie worden gegeven.
deze actie wordt alleen uitgevoerd als de transitie daadwerkelijk wordt uitgevoerd; dus als de transitie wordt bewaakt en de guard een transitie verbiedt, dan wordt de actie niet uitgevoerd.
als de overgang wordt uitgevoerd, zal de actie worden uitgevoerd tussen deonExit
handler van de huidige status en de onEntry
handler van de doelstatus (die dezelfde status kan zijn in geval van een nieuwe overgang.
Licentie
Apache 2.0 Licentie
aangemaakt door @oxo42
onderhouden door Chris Narkiewicz @ezaquarii