2

スプリング ステート マシンの使用を開始したばかりです。いくつか質問があります。

  • ステート コンテキストは、ステート マシンごとに 1 回だけですか?
  • ステート マシンに渡されたイベントは、ブロックする方法で実行されますか? イベントがトリガーされるたびに新しいステートマシンを提供するなど、それらを並行して実行する方法はありますか?

これが私のコードです:

状態と遷移の構成:

@Override
public void configure(
        StateMachineTransitionConfigurer<WorkFlowStates, WorkFlowEvent> transitions)
                throws Exception {
    transitions
    .withExternal()
    .source(WorkFlowStates.ready)
    .target(WorkFlowStates.l1Creation)
    .event(WorkFlowEvent.createWorkItem)
    .action(workFlowCreator.createL1())

状態遷移中のアクションの提供:

public Action<WorkFlowStates, WorkFlowEvent> createL3() {
    return new Action<WorkFlowStates, WorkFlowEvent>() {

        public void execute(StateContext<WorkFlowStates, WorkFlowEvent> context) {
            System.out.println("l3 creation in action");
            Map<Object, Object> variables = context.getExtendedState().getVariables();
            Integer counter = (Integer)variables.get("counter");
            if(counter == null) counter = 1;
            else counter = counter+1;
            variables.put("counter", counter);
            System.out.println("Counter is "+counter);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            variables.put(Level.l3, WorkItemFactory.createFailureL1L2L3WorkItem());
            variables.put("level", Level.l3);
            System.out.println("l3 created");
        }
    };
}

タスク実行者:

public void configure(StateMachineConfigurationConfigurer<WorkFlowStates, 
WorkFlowEvent>config)
                throws Exception {
    config
    .withConfiguration()
    .autoStartup(true)
    .taskExecutor(taskExecutor())
    .listener(new WorkFlowStateMachineListener()); 
}

@Bean(name = StateMachineSystemConstants.TASK_EXECUTOR_BEAN_NAME)
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.afterPropertiesSet();
    taskExecutor.setCorePoolSize(5);
    return taskExecutor;
}

そして、ステート マシンに渡されるイベント:

StateMachine<WorkFlowStates, WorkFlowEvent> stateMachine = 
    context.getBean(StateMachine.class);

    stateMachine.sendEvent(WorkFlowEvent.createWorkItem);
    stateMachine.sendEvent(WorkFlowEvent.createWorkItem);
4

1 に答える 1

2

TaskExecutorはい、基本的なものとしてデフォルトの動作はブロックされていSyncTaskExecutorます。ドキュメントに記載されているように、これは一般的な構成を介して変更できます。領域を並列に実行するためにデフォルトで使用されるタスクのレシピも参照してください。ThreadPoolTaskExecutor

ブロックしているマシンから離れるときは、マシンがどのように動作するか、およびマシンがイベントを破棄する状態になる可能性があるため、さらにイベントを処理する準備が整ったときに注意を払う必要があります。これは通常、遅延イベントの追加を開始して、マシンが将来より適切な時間にそれらを処理できるようにする必要がある場合です。

于 2016-05-06T13:02:31.610 に答える