У меня есть функция конечного автомата
public Map<Object, Object> changeState(E triggeringEvent, UUID chillingUnitUuid, S states) throws Exception {
logger.debug("Changing chilling unit state with current state {}", states);
StateMachine<S, E> machine = getMachine(chillingUnitUuid.toString());
if (machine != null) {
logger.debug("Machine changing state");
machine.sendEvent(triggeringEvent);
persister.persist(machine, chillingUnitUuid.toString());
return machine.getExtendedState().getVariables();
}
logger.debug("Machine operation done");
return null;
}
private StateMachine<S, E> getMachine(String machineId) throws Exception {
mainMachine = null;
System.out.println("State machine " + mainMachine);
if (mainMachine == null) {
mainMachine = factory.getStateMachine(machineId);
mainMachine.stop();
mainMachine = persister.restore(mainMachine, machineId);
if(mainMachine.getId() ==null) {
System.out.println(mainMachine.getExtendedState().getVariables());
mainMachine.getExtendedState().getVariables().put(Constants.EXTENDED_STATE_ID, machineId);
}
} else if (!mainMachine.getId().equals(machineId)) {
mainMachine.stop();
mainMachine = persister.restore(mainMachine, machineId);
}
mainMachine.addStateListener(listener);
mainMachine.getStateMachineAccessor().doWithAllRegions(sma -> sma.addStateMachineInterceptor(interceptor));
mainMachine.start();
return mainMachine;
}
и моя конфигурация конечного автомата выглядит следующим образом
@Override
public void configure(StateMachineTransitionConfigurer<State, Evetns> transitions) throws Exception {
transitions.
withExternal().source(State.START).target(State.POWERON).event(Events.RECIVING_DATA).guard(guard1)
.and().withExternal().source(State.START).target(State.POWEROFF).event(Events.NO_DATA).guard(guard1)
.and().withExternal().source(State.POWERON).target(State.POWEROFF).event(Events.NO_DATA).guard(guard1)
.and().withExternal().source(State.POWEROFF).target(State.POWERON).event(Events.RECIVING_DATA).guard(guard1)
.and().withExternal().source(State.POWEROFF).target(State.TEMPORARILY_OUT_OF_SERVICE).event(Events.OUT_OF_SERVICE).guard(guard1)
.and().withExternal().source(State.POWERON).target(State.EMPTY).event(Events.EMPTY_TANK).guard(guard12)
.and().withExternal().source(State.POWERON).target(State.RUNNING).event(Events.MILKPUMPIBT_ON).guard(guard2)
.and().withExternal().source(State.POWERON).target(State.COOLED).event(Events.MILKPUMPIBT_OFF).guard(guard2)
.and().withExternal().source(State.POWERON).target(State.PRECOOLED).event(Events.COMPRESSOR_OFF).guard(guard2)
;
}
@Override
public void configure(StateMachineStateConfigurer<State, Events> states) throws Exception {
states.withStates()
.initial(State.START)
.state(State.POWERON)
.state(State.POWEROFF)
.and()
.withStates()
.parent(State.POWERON)
.initial(State.POWERON_INITIAL)
.state(State.PRECOOLED)
.state(State.COOLED)
.state(State.EMPTY)
.state(State.RUNNING)
.and()
.withStates()
.parent(State.POWEROFF)
.initial(State.POWEROFF_INITIAL)
.state(State.TEMPORARILY_OUT_OF_SERVICE)
;
}
, но когда я запускаю свой код, иногда вызывается функция защиты, иногда они не. я что-то упускаю, потому что почему функции охраны ведут себя так странно ?? как я могу заставить их работать все время ??
пожалуйста, помогите, я застрял на 3 дня.
Редактировать: это некоторые дополнительные переменные, необходимые
private final StateMachineFactory<S, E> factory;
private final StateListener<S, E> listener;
private final StateMachineInterceptor<S, E> interceptor;
private final StateMachinePersister<S, E, String> persister;
private StateMachine<S, E> mainMachine;