我们必须将调度程序Thread绑定到应用程序上下文。
我尝试使用@PostConstruct
,但是一旦应用程序启动它就会启动调度程序,但即使应用程序关闭且服务器已启动,它仍会在后台运行。
如果应用程序关闭,那么调度程序也应该停止。
我在Spring中使用Scheduler的方式(即Spring Boot)是在我的项目中有两个类(因此在构建之后包含在我的.jar中)。
1 - SchedulerConfig(配置所必需的)
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
private final int POOL_SIZE = 10;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
threadPoolTaskScheduler.initialize();
scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
2 - ScheduledTasks(具有由cron表达式定义的频率的实际计划任务)
@Component
public class ScheduledTasks {
private static final Logger LOG = Logger.getLogger(ScheduledTasks.class);
@Scheduled(cron = "0 0 * ? * *")
public void doSomething() {
// Do something
}
}
因此,由于所有内容都包含在正在运行的.jar中,当不再部署应用程序时,计划任务也不会运行。