0

次のリファレンスで説明されている方法でランナブルを実行する際に問題が発生しています。

http://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#statemachine-examples-tasks

TasksHandler handler = TasksHandler.builder()
    .task("1", sleepRunnable())
    .task("2", sleepRunnable())
    .task("3", sleepRunnable())
    .build();
handler.runTasks();

私の実装は次のようになります。

private Action<States, Events> getUnlockedAction() {
    return new Action() {
        @Override
        public void execute(StateContext sc) {
            System.out.println("in action..");
            handler = new TasksHandler.Builder().taskExecutor(taskExecutor()).task("1", dp.runProcess(1)).build();
            handler.addTasksListener(new MyTasksListener());

            handler.runTasks();

            System.out.println("after action..");
        }

    };
}

TaskExecutor の初期化は次のようになります。

    @Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor();
    te.setMaxPoolSize(50);
    te.setThreadNamePrefix("LULExecutor-");
    te.setCorePoolSize(25);
    te.initialize();
    return te;
}

dp (DataProcessor) のコードは次のようになります。

@Component
@Qualifier("dataProcessor")
public class ADataProcessor {

    public Runnable runProcess(final int i) {
    return new Runnable() {
        @Async
        @Override
        public void run() {
            long delay = (long) ((Math.random() * 10) + 1) * 1000;
            System.out.println("In thread " + i + "... sleep for " + delay);
            try {
                Thread.sleep(delay);
            } catch (InterruptedException ex) {
                Logger.getLogger(FSMFactoryConfig.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("After thread " + i + "...");
        }

    };
    }
}

コードを実行すると、'in action..' と 'after action..' のメッセージが遅延なく表示されます..

以下を使用する場合:

                taskExecutor().execute(dp.runProcess(1));
            taskExecutor().execute(dp.runProcess(2));
            taskExecutor().execute(dp.runProcess(3));
            taskExecutor().execute(dp.runProcess(4));
            taskExecutor().execute(dp.runProcess(5));
            taskExecutor().execute(dp.runProcess(6));

TasksHandler を使用して期待する結果が得られます。

  • 状態が UNLOCKED に変更されました
  • スレッド 2 で... 10000 のスリープ
  • スレッド 3 で... 5000 のスリープ
  • スレッド 4 で... 8000 のスリープ
  • スレッド 5 で... 4000 のスリープ
  • スレッド 6 で... 4000 のスリープ
  • スレッド 1 で... 9000 のスリープ
  • 2016 年 1 月 13 日 12:32:13 PM - org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor 初期化
  • 情報: ExecutorService を初期化しています
  • 状態が LOCKED に変更されました
  • スレッド5以降...
  • スレッド6以降...
  • スレッド 3 の後...
  • スレッド 4 の後...
  • スレッド 1 の後...
  • スレッド 2 の後...

TasksHandler を使用すると、スリープの遅延の前後のメッセージは表示されません。私の質問は、実際に実行可能ファイルを実行するにはどうすればよいですか?? 正しく実行している場合、何を確認すればよいですか?

4

2 に答える 2