<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Introduzione
Crea macchine a stati e flussi di lavoro leggeri basati su macchine a stati direttamente nel codice java.
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 è una porta di stateless per java
Caratteristiche
La maggior parte dei costrutti di macchine a stati standard sono supportati:
- Supporto generico per stati e trigger di qualsiasi tipo java (numeri, stringhe, enumerazioni, ecc.)
- Gerarchica stati
- di Entrata/uscita degli eventi per gli stati
- Guardia clausole di supporto condizionale transizioni
- azioni definite dall’Utente può essere eseguita durante la fase di transizione
- Interno di transizioni (non si chiama
onExit
/onEntry
) - Introspezione
Alcune estensioni utili sono anche previste:
- Parametrizzare trigger
- Rientrante stati
Gerarchica Stati
Nell’esempio riportato di seguito, il OnHold
stato è il sotto del Connected
stato. Ciò significa che è ancora connessa una chiamata OnHold
.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
Oltre alla proprietà StateMachine.getState()
, che riporterà lo stato corrente preciso, viene fornito un metodo isInState(State)
. isInState(State)
terrà conto delle sottostazioni, in modo che se l’esempio precedente fosse nello statoOnHold
, isInState(State.Connected)
valuterebbe anche true
.
Eventi di entrata/uscita
Nell’esempio, il metodo startCallTimer()
verrà eseguito quando viene connessa una chiamata. Il stopCallTimer()
verrà eseguito al termine della chiamata (riagganciando o lanciando il telefono contro il muro.)
La chiamata può spostarsi tra gli stati Connected
e OnHold
senza che i metodi startCallTimer(
) e stopCallTimer()
vengano chiamati ripetutamente perché lo stato OnHold
è un sottostato dello stato Connected
.
I gestori di eventi Entry/Exit possono essere forniti con un parametro di tipo Transition
che descrive gli stati di trigger,origine e destinazione.
Azione sulla transizione
È possibile eseguire un’azione definita dall’utente quando si esegue una transizione.Per una transizione “normale” o “rientrante” questa azione verrà chiamatasenza parametri. Per le transizioni “dinamiche” (quelle che calcolano lo stato di thetarget in base ai parametri dati dal trigger) i parametri del thetrigger saranno dati all’azione.
Questa azione viene eseguita solo se la transizione viene effettivamente eseguita; quindi se la transizione è protetta e la guardia proibisce una transizione, allora l’azione non viene eseguita.
Se viene eseguita la transizione, l’azione verrà eseguita tra il gestoreonExit
dello stato corrente e il gestore onEntry
dello stato di destinazione (che potrebbe essere lo stesso stato in caso di una transizione rientrante.
Licenza
Apache 2.0 Licenza
Creato da @oxo42
Mantenuto da Chris Narkiewicz @ ezaquarii