2016-05-12 20 views
1

Ich habe 20 gleichzeitige Benutzer Verarbeitung Aufträge in separaten Thread. Wie behalte ich den Zustand mit der Federzustandsmaschine?Feder StateMachine für mehrere Threads gleichzeitig

Ich versuche:

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()); 
    } 

Aber es auf; y sagt mir Zustandsmaschine, nicht für die Bestellung:

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

ich andere Möglichkeit, diese haben aber diese Option sieht nicht aus gut für jede Veranstaltung:

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

Antwort

0

Es hat endlich funktioniert. Ich musste @EnableStateMachineFactory auf der Konfigurationsebene anstelle von @EnableStateMachine verwenden, und aus dem aufrufenden Programm:

@Autowired 
StateMachineFactory<String, String> factory; 

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