问题描述
我用SpringBoot创建了一个简单的演示应用程序,并包含了Actuator。 用@Scheduled注释的任务会显示在执行器中,但是以编程方式启动的任务则不会。有没有办法让他们也出现?
我已经注释了@EnableScheduling。
我的组件看起来像这样:
@Component
public class DemoComponent {
private final TaskScheduler scheduler;
public DemoComponent(TaskScheduler scheduler) {
this.scheduler = scheduler;
}
@postconstruct
public void init() {
scheduler.scheduleAtFixedrate(() -> System.out.println("Hi"),1000);
}
@Scheduled(fixedrate = 1000)
public void work() {
System.out.println("Hello");
}
}
,执行器的结果仅显示带注释的任务:
{
"cron": [],"fixedDelay": [],"fixedrate": [
{
"runnable": {
"target": "com.example.demo.DemoComponent.work"
},"initialDelay": 0,"interval": 1000
}
],"custom": []
}
解决方法
看看https://github.com/spring-projects/spring-boot/pull/9623/commits/94b00a7b0681b050bba03b4c49edf2df2ec65376下的代码,我想您将需要向ScheduledTaskRegistrar
注册计划的作业,而不是直接向TaskScheduler
注册。因此,应执行以下操作:
@Component
public class DemoComponent {
private final ScheduledTaskRegistrar scheduler;
public DemoComponent(ScheduledTaskRegistrar scheduler) {
this.scheduler = scheduler;
}
@PostConstruct
public void init() {
scheduler.addFixedRateTask(() -> System.out.println("Hi"),1000);
}
@Scheduled(fixedRate = 1000)
public void work() {
System.out.println("Hello");
}
}