【问题标题】:Crash on StateMachineBuilder timerStateMachineBuilder 计时器崩溃
【发布时间】:2016-01-06 12:49:25
【问题描述】:

我使用 Spring StateMachineBuilder 创建一个 Bean。

在机器中,我有一个 Action,它每秒重复一次。

这是要演示的最小构建器代码:

@Bean
public StateMachine<State, Event> getStateMachine() throws Exception {
    Action action = s -> {};
    Builder<State, Event> builder = StateMachineBuilder.builder();

    builder.configureConfiguration()
            .withConfiguration()
            .autoStartup(true)
            .taskExecutor(new SyncTaskExecutor())
            .taskScheduler(new ConcurrentTaskScheduler());

    builder.configureStates()
            .withStates()
            .initial(State.STARTING)
            .state(State.ACTION, action, null)
            .end(State.DONE)
            .states(EnumSet.allOf(State.class));

    builder.configureTransitions()
            .withExternal()
            .source(State.STARTING).target(State.ACTION).event(Event.START)
            .and().withInternal()
            .source(State.ACTION)
            .action(action)
            .timer(1000)

            .and().withExternal()
            .source(State.ACTION).target(State.DONE).event(Event.STOP);

    return builder.build();
}

无法创建 bean,我收到此错误:

Caused by: java.lang.NullPointerException
    at org.springframework.statemachine.trigger.TimerTrigger.doStart(TimerTrigger.java:51)
    at org.springframework.statemachine.support.LifecycleObjectSupport.start(LifecycleObjectSupport.java:120)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.registerTriggerListener(DefaultStateMachineExecutor.java:415)
    at org.springframework.statemachine.support.DefaultStateMachineExecutor.<init>(DefaultStateMachineExecutor.java:116)
    at org.springframework.statemachine.support.AbstractStateMachine.onInit(AbstractStateMachine.java:258)
    at org.springframework.statemachine.support.LifecycleObjectSupport.afterPropertiesSet(LifecycleObjectSupport.java:67)
    at org.springframework.statemachine.config.ObjectStateMachineFactory.buildStateMachineInternal(ObjectStateMachineFactory.java:79)
    at org.springframework.statemachine.config.AbstractStateMachineFactory.buildMachine(AbstractStateMachineFactory.java:547)
    at org.springframework.statemachine.config.AbstractStateMachineFactory.getStateMachine(AbstractStateMachineFactory.java:193)
    at org.springframework.statemachine.config.StateMachineBuilder$Builder.build(StateMachineBuilder.java:128)

如果我删除 withInternal() [...] .timer(1000),它会起作用,但我会失去重复功能。

我的构建器代码有什么问题?

【问题讨论】:

    标签: java spring exception state-machine


    【解决方案1】:

    我相信这是弹簧状态机中的一个错误。仅当您使用 StateMachineBuilder 而不是使用 springboot 配置 StateMachine 时才会发生这种情况。

    在 AbstractStateMachineFactory.java 创建新实例时,它不会在 TimerTrigger 上设置 taskScheduler。我可以通过添加来解决这个问题:

    AbstractStateMachineFactory.java : 547
    
    if( taskScheduler != null )
    {
      t.setTaskScheduler(taskScheduler);
    }
    

    我在这里#178向项目提交了拉取请求。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2013-08-22
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多