2

別のスレッドで 20 の同時ユーザー処理オーダーがあります。スプリングステートマシンを使用して状態を維持するにはどうすればよいですか?

やっています:

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

しかし、それはどの順序ではなく、状態マシンを教えてくれます:

@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);
4

1 に答える 1

1

それはついに働いた。@EnableStateMachine の代わりに構成レベルで @EnableStateMachineFactory を使用し、呼び出しプログラムから使用する必要がありました。

@Autowired
StateMachineFactory<String, String> factory;

    public void getOrderStatus(long id) {
        StateMachine<String, String> stateMachine = factory.getStateMachine();
        stateMachine.start();
        stateMachine.sendEvent();
    }
于 2016-05-12T17:55:50.080 に答える