2016-01-06 50 views
0

我使用Spring StateMachineBuilder来创建一个Bean。StateMachineBuilder计时器崩溃

在机器中,我有一个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(); 
} 

不能创建豆,我得到这个错误:

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),它的工作原理,但我输了重复功能。

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

回答

1

我相信这是一个在春天statemachine的错误。只有在使用StateMachineBuilder而不是使用springboot配置StateMachine时才会发生这种情况。

在AbstractStateMachineFactory.java中,当它创建它的新实例时,它不会在TimerTrigger上设置taskScheduler。我能够加入到解决这个问题:

AbstractStateMachineFactory.java : 547 

if(taskScheduler != null) 
{ 
    t.setTaskScheduler(taskScheduler); 
} 

我提交了拉要求项目在这里#178