2016-05-12 59 views
1

我在单独的线程中有20个并发用户处理命令。我如何使用弹簧状态机来维持状态?多线程并发的spring statemachine

我想:

public class myclass extends EnumStateMachineConfigurerAdapter<OrderState, OrderEvents> 

@Override 
    public void configure(StateMachineTransitionConfigurer<OrderState, OrderEvents> transitions) 
      throws Exception { 
     transitions 
       .withExternal() 
       .source(OrderState.A).target(OrderState.B) 
       .event(OrderEvents.X) 
       .and() 
       .withExternal() 
       .source(OrderState.A).target(OrderState.C) 
       .event(OrderEvents.Y) 
@Override 
    public void configure(StateMachineConfigurationConfigurer<OrderState, OrderEvents> config) throws Exception { 
     config 
       .withConfiguration() 
       .autoStartup(true) 
       .listener(new OrderStateMachineListener()); 
    } 

但它; Y告诉我的状态机,而不是哪个顺序:

@Override 
    public void stateChanged(State<OrderState, OrderEvents> from, State<OrderState, OrderEvents> to) { 
     System.out.println("Order state changed to " + to.getId()); 
    } 

我有这个其他选择,但这一选择不看对于每个活动都很好:

stateMachine.stop(); 
     stateMachine 
       .getStateMachineAccessor() 
       .doWithAllRegions(access -> access.resetStateMachine(new DefaultStateMachineContext<>(sourceState, null, null, null))); 
     stateMachine.start(); 
     stateMachine.sendEvent(event); 

回答

0

它终于奏效了。我必须在配置级别上使用@EnableStateMachineFactory而不是@EnableStateMachine,并且从调用程序:

@Autowired 
StateMachineFactory<String, String> factory; 

    public void getOrderStatus(long id) { 
     StateMachine<String, String> stateMachine = factory.getStateMachine(); 
     stateMachine.start(); 
     stateMachine.sendEvent(); 
    }