spring - Spring 的 @Scheduled 没有按预期的时间间隔触发 - 错过了很多
问题描述
我有这样配置的类(为简洁起见,我删掉了一些):
- 业务逻辑平均需要 1 秒或更短的时间来运行。
- 该应用程序在整个过程中确实有几十个 @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,但没有成功。我可以创建一个新的执行器池,然后将重要的任务分配给它,让另一个处理其他所有事情吗?如果是这样,是否有其他人如何做到这一点的好例子?
如果这不是一个选项,有没有办法调试并查看为什么即使我有大量可用线程,我也会得到如此零星的调度?
解决方案
推荐阅读
- javascript - ReactJS 使用异步 setState 更新状态的最佳方法
- cloudera - 无法在 Cloudera Hue 的表详细信息中加载标签
- docker - 实际图像的大小是多少?
- reactjs - 将多个文件上传到js中的firebase存储后如何获取url数组
- ios - Swift 应用程序在关闭时有奇怪的行为
- authorization - 多个策略文件中的 XACML Authzforce PDP 配置
- mysql - 如何修复“排序规则的非法混合(utf8_unicode_ci,IMPLICIT)和(utf8_general_ci,IMPLICIT)操作'='”
- python - 如何在 qiskit 中从 np.array 创建单一门?
- postgresql - Docker-compose 依赖于不等到依赖的服务没有完全启动
- rust - 为什么装箱变量需要显式类型才能传递给函数?