首先,很抱歉,如果以前已经问过这个问题,我找不到类似的问题,所以我决定自己问这个问题。

假设我有两个不同的cron作业,例如:

@Scheduled(cron = "0 30 * * * *")
private void sleepForDays() {
    while(true) sleep();
}

@Scheduled(cron= "0 * * * * *")
private void logHello() {
   log("hello!");
}


我有一个可以运行几天的功能,该功能每隔30分钟触发一次。 (0 30 * * * *)让我们将其命名为sleepForDays()

我还有另一个应该每分钟记录一次问候的功能。让我们将其命名为logHello()

问题:


一旦启动sleepForDays(),我相信第二个sleepForDays()在第一个sleepForDays()完成之前不会启动。对?
logHello()启动后,sleepForDays()不会每分钟工作一次。我确实在生产环境中记录了此函数的内容,但是在输出文件中看不到那些日志。显然,在执行sleepForDays()时它不起作用。


意图:


我希望不同的cronJobs彼此独立运行。换句话说,我不希望logHello()阻止sleepForDays()
我也想避免重复执行同一cronJob。如果sleepForDays()已经在执行,我不想再启动TaskScheduler


我发布这个问题的主要目的是问题2。关于StackOverflow中的类似帖子,我认为问题1的答案是肯定的。我想确保我在问题1中的假设是正确的。

感谢您的时间!

编辑:

问题可能与以下事实有关:我使用默认参数初始化了TaskScheduler bean。默认情况下,TaskScheduler不支持计划的cronjobs多线程。如果我使用多线程支持初始化TaskScheduled bean,我的问题1的答案是否仍然是?

Bean初始化如下:

@Bean
public static TaskScheduler taskScheduler() {
    return new ConcurrentTaskScheduler();
}


编辑2:解决方案

非常感谢贡献者,我设法使用下面的bean初始化同时运行这些功能。我只是用这个替换了 bean:

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(2);
    threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler"); // i dont know what it does, i used it anyways lol
    return threadPoolTaskScheduler;
}

最佳答案

默认情况下,所有@Scheduled方法共享一个线程。您可以通过定义例如自定义ThreadPoolTaskScheduler bean来修改此行为:

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
    ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
    threadPoolTaskScheduler.setPoolSize(5);
    threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
    return threadPoolTaskScheduler;
}

10-01 22:40