首页 > 解决方案 > Spring 的 @Scheduled 没有按预期的时间间隔触发 - 错过了很多

问题描述

我有这样配置的类(为简洁起见,我删掉了一些):

它确实调用了数据库(尚未崩溃或遇到连接问题):

@EnableScheduling
public class AppConfig {

    ...

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(200);
        scheduler.setRemoveOnCancelPolicy(true);
        scheduler.initialize();
        return scheduler;
    }

    ...
}  


@Service
public class SomeBusinessLogic {

    ...

    @Scheduled(cron = "0 */10 * * * *")
    public void importanTask() {
        synchronized(lockProcess) {
            this.executeLogic();
        }
    }

    ...

}

我希望每 10 分钟看到一次日志消息,但这是我看到的:

[WARN ] 2021-05-31 00:00:00.119 [threadPoolTaskScheduler-193] SomeBusinessLogic - ...: [C
[WARN ] 2021-05-31 01:28:40.091 [threadPoolTaskScheduler-182] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 01:33:58.809 [threadPoolTaskScheduler-183] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 01:40:00.009 [threadPoolTaskScheduler-26] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 01:50:00.007 [threadPoolTaskScheduler-94] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 02:00:00.014 [threadPoolTaskScheduler-98] SomeBusinessLogic - ...: [Ca
[WARN ] 2021-05-31 03:13:46.469 [threadPoolTaskScheduler-25] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 03:23:14.383 [threadPoolTaskScheduler-128] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 03:30:00.008 [threadPoolTaskScheduler-128] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 03:40:00.007 [threadPoolTaskScheduler-191] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 03:50:00.006 [threadPoolTaskScheduler-190] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 04:00:00.011 [threadPoolTaskScheduler-138] SomeBusinessLogic - ...: [C
[WARN ] 2021-05-31 05:24:23.808 [threadPoolTaskScheduler-64] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 05:30:00.010 [threadPoolTaskScheduler-90] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 05:40:00.008 [threadPoolTaskScheduler-47] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 05:50:00.008 [threadPoolTaskScheduler-64] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 06:00:00.017 [threadPoolTaskScheduler-100] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 07:21:12.429 [threadPoolTaskScheduler-191] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 07:30:00.007 [threadPoolTaskScheduler-126] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 07:40:00.010 [threadPoolTaskScheduler-122] SomeBusinessLogic - ...: []
[WARN ] 2021-05-31 07:50:00.007 [threadPoolTaskScheduler-36] SomeBusinessLogic - ...: []

重新启动Tomcat后,大约一个小时,一切都很好,我会像我预期的那样每10分钟看到一次,但不久之后,它变得非常零星。这个特定的计划任务非常重要。

我已将上述池增加到 200,但没有成功。我可以创建一个新的执行器池,然后将重要的任务分配给它,让另一个处理其他所有事情吗?如果是这样,是否有其他人如何做到这一点的好例子?

如果这不是一个选项,有没有办法调试并查看为什么即使我有大量可用线程,我也会得到如此零星的调度?

标签: springscheduled-tasksscheduling

解决方案


推荐阅读