以编程方式添加调度程序时,弹簧执行器系统状态缺少调度程序数据
Sring actuator system status missing scheduler data when schedulers are added programatically
我正在使用 Java 11,Spring 启动。我有我的调度程序 运行 @Scheduled
注释,它们自动出现在 Actuator 页面:#/administration/systemstatus
中。但是从现在开始,我必须提供从 UI 强制安排任务的可能性,我必须在 TaskScheduler
上为当前时间的此类任务调用 schedule
操作,并且在它结束后,我必须再次根据 application.properties 中的某些 cron 表达式来安排此类任务(因为计划操作会更改计划时间,而我的任务通常必须在指定的 cron 时间工作,并且只有有时会由用户表单 UI 额外触发) .这促使我编写自己的调度组件,因为我发现不可能使用 @Schedule 注释来完成所有这些。但作为副作用,我在执行器系统状态中没有关于任务及其 cron 表达式的数据。下面是代码,我只包括在部署应用程序时将任务添加到调度程序的部分。我没有添加重新安排操作。你知道如何修复执行器数据吗?
@Component
@Slf4j
public class MyTaskService {
private final TaskScheduler scheduler;
private final List<CustomTask> taskList; //runnable tasks
private final RunningTasksFutureHolder runningTasksFutureHolder;
public MyTaskService(TaskScheduler scheduler,
List<CustomTask> taskList,
RunningTasksFutureHolder runningTasksFutureHolder) {
this.scheduler = scheduler;
this.taskList = taskList;
this.runningTasksFutureHolder = runningTasksFutureHolder;
}
@PostConstruct
public void afterLoad() {
askList.forEach(this::addTaskToScheduler);
}
public void addTaskToScheduler(CustomTask task) {
//here tasks are added to scheduler and they are not visible in actuator
ScheduledFuture<?> scheduledTask = scheduler.schedule(task, new CronTrigger(task.getCronExpression()));
runningTasksFutureHolder.add(task.getTaskType(), scheduledTask);
}
}
@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//do nothing here
}
@Bean
public TaskScheduler poolScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
scheduler.setPoolSize(5);
scheduler.initialize();
return scheduler;
}
}
您应该使用 ScheduledTaskRegistrar
而不是直接调用 TaskScheduler
。对于 cron 任务,相应的方法是 addCronTask()
.
参考文献:
我正在使用 Java 11,Spring 启动。我有我的调度程序 运行 @Scheduled
注释,它们自动出现在 Actuator 页面:#/administration/systemstatus
中。但是从现在开始,我必须提供从 UI 强制安排任务的可能性,我必须在 TaskScheduler
上为当前时间的此类任务调用 schedule
操作,并且在它结束后,我必须再次根据 application.properties 中的某些 cron 表达式来安排此类任务(因为计划操作会更改计划时间,而我的任务通常必须在指定的 cron 时间工作,并且只有有时会由用户表单 UI 额外触发) .这促使我编写自己的调度组件,因为我发现不可能使用 @Schedule 注释来完成所有这些。但作为副作用,我在执行器系统状态中没有关于任务及其 cron 表达式的数据。下面是代码,我只包括在部署应用程序时将任务添加到调度程序的部分。我没有添加重新安排操作。你知道如何修复执行器数据吗?
@Component
@Slf4j
public class MyTaskService {
private final TaskScheduler scheduler;
private final List<CustomTask> taskList; //runnable tasks
private final RunningTasksFutureHolder runningTasksFutureHolder;
public MyTaskService(TaskScheduler scheduler,
List<CustomTask> taskList,
RunningTasksFutureHolder runningTasksFutureHolder) {
this.scheduler = scheduler;
this.taskList = taskList;
this.runningTasksFutureHolder = runningTasksFutureHolder;
}
@PostConstruct
public void afterLoad() {
askList.forEach(this::addTaskToScheduler);
}
public void addTaskToScheduler(CustomTask task) {
//here tasks are added to scheduler and they are not visible in actuator
ScheduledFuture<?> scheduledTask = scheduler.schedule(task, new CronTrigger(task.getCronExpression()));
runningTasksFutureHolder.add(task.getTaskType(), scheduledTask);
}
}
@Configuration
@EnableScheduling
public class SchedulingConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//do nothing here
}
@Bean
public TaskScheduler poolScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
scheduler.setPoolSize(5);
scheduler.initialize();
return scheduler;
}
}
您应该使用 ScheduledTaskRegistrar
而不是直接调用 TaskScheduler
。对于 cron 任务,相应的方法是 addCronTask()
.
参考文献: