<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Introdução
Criar máquinas de estado e leve máquina de estado baseado em fluxos de trabalho diretamente em código 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 é uma porta de monitoração de estado para java
Características
Mais padrão de máquina de estado construções são suportadas:
- suporte Genérico para os estados e disparadores de qualquer tipo java (números, strings, enumerações, etc.)
- Hierárquica estados
- Entrada/saída de eventos para os estados
- Guarda cláusulas de apoio condicional transições
- ações definidas pelo Usuário podem ser executadas quando a transição
- transições Internas (não chamando
onExit
/onEntry
) - Introspecção
Algumas extensões úteis também são fornecidos:
- Parametrizado, dispara
- Reentrante estados
Hierárquica Estados
No exemplo abaixo, o OnHold
estado é um substate do Connected
estado. Isso significa que uma chamada OnHold
ainda está conectada.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
além da propriedade StateMachine.getState()
, que relatará o estado atual preciso, um método isInState(State)
é fornecido. isInState(State)
levará em consideração as subestações, de modo que, se o exemplo acima estivesse no estadoOnHold
, isInState(State.Connected)
também avaliaria para true
.
eventos de entrada/saída
no exemplo, o método startCallTimer()
será executado quando uma chamada estiver conectada. O stopCallTimer()
seráexecutado quando a chamada for concluída (desligando ou arremessando o telefone contra a parede.)
a chamada pode se mover entre os Estados Connected
e OnHold
sem os métodos startCallTimer(
) e stopCallTimer()
sendo chamados repetidamente porque o estado OnHold
é uma subestação do estado Connected
.
os manipuladores de eventos de entrada/saída podem ser fornecidos com um parâmetro do tipo Transition
que descreve os estados de gatilho,origem e destino.
Ação na transição
é possível executar uma ação definida pelo usuário ao fazer uma transição.Para uma transição’ normal ‘ou’ reentrante’, esta ação será chamadasem quaisquer parâmetros. Para transições ‘dinâmicas’ (aqueles que calculam oestado de destino com base em parâmetros fornecidos pelo gatilho), os parâmetros do thetrigger serão dados à ação.
esta ação só é executada se a transição for realmente realizada; portanto, se a transição for guardada e o guarda proibir uma transição, a ação não será executada.
se a transição for realizada, a ação será executada entre o manipuladoronExit
do estado atual e o manipulador onEntry
do Estado do objeto (que pode ser o mesmo estado no caso de uma transição reentrante.
Licença
Apache 2.0 Licença
Criado por @oxo42
Mantidas por Chris Narkiewicz @ezaquarii