弹簧状态机复位

时间:2017-08-15 11:46:11

标签: spring spring-statemachine

我对重置状态机有疑问。 构造

protected StateMachine<ProfilingState, ProfilingEvent> buildStateMachine(
            StateMachineBuilder.Builder<SomeState, SomeEvent> builder) throws Exception {

  builder.configureStates()
                .withStates()
                .initial(SomeState.State1)
                .states(EnumSet.allOf(SomeState.class));

        builder.configureTransitions()
                .withExternal()
                .source(SomeState.Step1)
                .target(SomeState.Step2)
                .event(SomeEvent.Event1)
                .action(step1Action())
                .and()
                .withExternal()
                .source(SomeState.Step2)
                .target(SomeState.Step3)
                .event(SomeEvent.Event2)
                .action(step2Action())
                .and();
            return builder.build();
        }

我有api用于持久/恢复状态机。在恢复期间,我将重置状态机设置为先前的持久状态。

stateMachine
    .getStateMachineAccessor()
    .doWithAllRegions(access -> {
        access.resetStateMachine(
            new DefaultStateMachineContext(currentState, null, null, extendedState));
});
stateMachine.start();

我希望我可以在jvm崩溃后重置状态机,并从我上一次持久状态继续。 例如,最后一个持久化状态是Step2。让我们假设Step2的动作是一个长循环。让我们假设发生了Jvm崩溃,有些人正在处理这个循环。在应用程序启动期间,应用程序识别出存在未完成的流。 所以目标是从最后一个持久状态继续。这意味着在将状态机重置为State2之后,我希望触发step2Action并继续处理,因为Step2还没有完成。 不幸的是,在我将状态机重置为State2之后,没有调用step2Action。 是否可以针对此案例触发此操作?

1 个答案:

答案 0 :(得分:0)

不,不是step2Action动作附加到转换,重置不会导致状态的任何条目。

随意在github上创建增强请求,因为在考虑重置后可能发生的情况时,可能会执行状态操作。我们永远不会执行输入操作,因为在重置期间没有输入状态,但正如我所说,执行状态执行操作可能是有意义的。