функция охраны не принимает во время выполнения для конечного автомата пружины - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть функция конечного автомата

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...