我有一个spring scheduler,它有三个不同触发器的任务(cron触发器)。对于每个任务,我都有一个可以修改cron表达式的UI。我希望在服务收到更新请求时重新安排任务。下面是我的Scheduler configuratin。如何在运行时更改其中一个任务的计划(当UI发送请求以更新DB中的cron表达式时)。使用以下方法,仅使用下一个计划更新调度程序。即,在调用触发器时调用nextExecutionTime()方法。
@Configuration
@EnableScheduling
public class Config implements SchedulingConfigurer {
@Inject
MyDao db;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
List<TaskConfig> conf = db.readTaks();
conf.forEach((TaskConfig aTask) -> {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
System.out.println("Running task + " + aTask.getName());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(final TriggerContext triggerContext) {
String expression = aTask.getCronExpression();
CronTrigger trigger = new CronTrigger(expression);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
});
});
}
}
编辑:例如。考虑我的cron表达式设置为最初在每小时的第40分钟触发,当前时间是11:20 AM。现在,如果我现在更新cron以在第25分钟触发,我预计该任务将在上午11:25触发。但是使用上面的代码它会在上午11:40触发,然后在下午12:25触发。这不是我想要的行为。
答案 0 :(得分:1)
我认为你有两个选择:
db.readTaks()
返回更新的计划。使用新时间添加触发器,执行一次。这可以通过注入ScheduledTaskRegistrar
并在上午11:25添加触发器来完成,就像在您的示例中一样。这是一个粗略的例子:
@Autowired
private ScheduledTaskRegistrar taskRegistrar;
void runOnce() {
taskRegistrar.scheduleCronTask(task);
}