使调度程序特定于应用程序而不是特定于服务器

时间:2019-04-10 11:35:33

标签: spring quartz-scheduler

我们必须将调度程序线程绑定到应用程序上下文。

我尝试使用@PostConstruct,但是一旦应用程序启动,它就会启动调度程序,但是即使应用程序已关闭且服务器已启动,它仍在后台运行。

如果应用程序已关闭,则调度程序也应停止。

1 个答案:

答案 0 :(得分:0)

我在Spring(即Spring Boot)中使用Scheduler的方式是在项目中包含两个类(因此,在构建后包含在我的.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中,因此当不再部署应用程序时,计划任务也将无法运行。

另请参见 https://www.baeldung.com/spring-scheduled-tasks