stateless4j / stateless4j

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

Bouwstatus

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 truezou 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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.