我有问题,我想在运行时创建一个计划任务。计划任务应以固定速率触发。但现在我遇到了手动设置计划未以异步方式触发的问题。
主要问题是,我们没有任何可以启动调度程序的修复点。它应该在我读取特定值 (1) 时创建,并在值变回 (0) 时被销毁。否则我们可以使用下面测试 1 中描述的注释配置。
到目前为止我尝试了什么:
1. 安排@Scheduled(fixedRate = 500L)和@Async
代码
@Async
@Scheduled(fixedRate = 500L)
public void annotationTest() {
UUID id = UUID.randomUUID();
log.warn("Hello from Thread {} going to sleep", id);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.warn("Finished Thread {}", id);
}
在类级别也有@EnableAsync和注释。@EnableScheduling
结果
09:56:24.855 [task-5] : Hello from Thread 3b5514b2-3b80-4641-bf12-2cd320c4b6e5 going to sleep
09:56:25.355 [task-6] : Hello from Thread e98514a7-e193-422b-9569-f7635deb33f8 going to sleep
09:56:25.356 [task-4] : Finished Thread d86f5f24-bffb-4ddd-93fe-2334ed48cf91
09:56:25.854 [task-7] : Hello from Thread cfc2ab03-4e7e-4a4a-aa08-41d696cb6df7 going to sleep
09:56:25.855 [task-5] : Finished Thread 3b5514b2-3b80-4641-bf12-2cd320c4b6e5
09:56:26.355 [task-6] : Finished Thread e98514a7-e193-422b-9569-f7635deb33f8
评论
这按预期工作,但我们无法使用它,因为我们必须在运行时创建调度程序并在特定时间/输入后销毁它。
2. 设置一个ScheduledTaskRegistrar
代码
//@Configuration
@Bean
public ScheduledTaskRegistrar scheduledTaskRegistrar() {
ScheduledTaskRegistrar scheduledTaskRegistrar = new ScheduledTaskRegistrar();
scheduledTaskRegistrar.setScheduler(threadPoolTaskScheduler());
return scheduledTaskRegistrar;
}
@Bean
public TaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
return scheduler;
}
//@Component
public void printMessages() {
scheduledTaskRegistrar.scheduleFixedRateTask(new FixedRateTask(new OwnRunnable(), 500L, 0L));
}
还将OwnRunnable休眠 1 秒,然后打印完成文本
正如我们所见,任务以同步方式运行,不符合我们的要求。
繁华开满天机
相关分类