Spring 状态机任务执行未触发

Spring State Machine task execution not firing

我在按照以下参考资料中描述的方式获得 运行nable 到 运行 时遇到问题:

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 的期望..

使用 TasksHandler 时,在睡眠延迟之前或之后显示

None 条消息。所以我的问题是,我如何实际执行我的 运行nable?如果我做的正确,我应该检查什么?

我认为您误解了一些事情。首先,您要链接到具有原始想法的 tasks 示例,该示例已变成 tasks recipe. It's also worth to look unit tests 任务。

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

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

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

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