以编程方式添加调度程序时,弹簧执行器系统状态缺少调度程序数据

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().

参考文献: