Spring State Machine任务执行未触发

时间:2016-01-13 16:00:02

标签: spring asynchronous spring-statemachine

我遇到的问题是让runnable以以下引用中描述的方式运行:

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 + "...");
        }

    };
    }
}

当我执行我的代码时,我会看到“在行动中......”和“在行动之后......”的消息,没有任何延迟..

当我使用以下内容时:

                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 - org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor初始化
  • INFO:初始化ExecutorService
  • 州改为LOCKED
  • 线程5 ......
  • 之后
  • 线程6 ......
  • 之后
  • 线程3 ......
  • 之后
  • 线程4 ......
  • 之后
  • 线程1 ...
  • 之后
  • 线程2 ......
  • 之后

使用TasksHandler时,不会显示睡眠延迟之前或之后的任何消息。所以我的问题是,我如何实际执行我的runnable?如果我正确地做了,我应该检查什么?

2 个答案:

答案 0 :(得分:0)

我认为你有点误解了一些事情。首先,您要链接到具有原始想法的tasks示例,并将其转换为tasks recipe。同样值得查看unit tests任务。

您使用taskhandler注册runnables从中获取状态机以启动它,然后告诉处理程序运行任务。

我现在意识到在文档中我可能应该更清楚它的用法。

答案 1 :(得分:0)

将所有任务添加到处理程序后,我必须在调用 runTasks() 之前启动状态机。

handler.getStateMachine().startReactively().block();
handler.runTasks();