Spring 状态机任务执行未触发
Spring State Machine task execution not firing
我在按照以下参考资料中描述的方式获得 运行nable 到 运行 时遇到问题:
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 的期望..
- 状态更改为已解锁
- 在线程 2 中...休眠 10000
- 在线程 3 中...休眠 5000
- 在线程 4 中...休眠 8000
- 在线程 5 中...休眠 4000
- 在线程 6 中...休眠 4000
- 在线程 1 中...休眠 9000
- 2016 年 1 月 13 日 12:32:13 下午 - org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 初始化
- 信息:正在初始化 ExecutorService
- 状态更改为锁定
- 线程 5 之后...
- 线程 6 之后...
- 线程 3 之后...
- 线程 4 之后...
- 线程 1 之后...
- 线程 2 之后...
使用 TasksHandler 时,在睡眠延迟之前或之后显示 None 条消息。所以我的问题是,我如何实际执行我的 运行nable?如果我做的正确,我应该检查什么?
我认为您误解了一些事情。首先,您要链接到具有原始想法的 tasks
示例,该示例已变成 tasks recipe. It's also worth to look unit tests 任务。
您使用 taskhandler
注册 运行nables 从中获取状态机以启动它,然后告诉处理程序 运行 任务。
我现在意识到在文档中我可能应该更清楚它的用法。
将所有任务添加到处理程序后,我必须在调用 runTasks()
之前启动状态机。
handler.getStateMachine().startReactively().block();
handler.runTasks();
我在按照以下参考资料中描述的方式获得 运行nable 到 运行 时遇到问题:
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 的期望..
- 状态更改为已解锁
- 在线程 2 中...休眠 10000
- 在线程 3 中...休眠 5000
- 在线程 4 中...休眠 8000
- 在线程 5 中...休眠 4000
- 在线程 6 中...休眠 4000
- 在线程 1 中...休眠 9000
- 2016 年 1 月 13 日 12:32:13 下午 - org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 初始化
- 信息:正在初始化 ExecutorService
- 状态更改为锁定
- 线程 5 之后...
- 线程 6 之后...
- 线程 3 之后...
- 线程 4 之后...
- 线程 1 之后...
- 线程 2 之后...
None 条消息。所以我的问题是,我如何实际执行我的 运行nable?如果我做的正确,我应该检查什么?
我认为您误解了一些事情。首先,您要链接到具有原始想法的 tasks
示例,该示例已变成 tasks recipe. It's also worth to look unit tests 任务。
您使用 taskhandler
注册 运行nables 从中获取状态机以启动它,然后告诉处理程序 运行 任务。
我现在意识到在文档中我可能应该更清楚它的用法。
将所有任务添加到处理程序后,我必须在调用 runTasks()
之前启动状态机。
handler.getStateMachine().startReactively().block();
handler.runTasks();