ScheduledExecutorService sch = Executors.newScheduledThreadPool(4); sch.scheduleAtFixedRate(task, 0, 1, TimeUnit.HOURS);
六个整点统计任务,只有第一个准点跑,后面的依次往后拖,最晚的一个 10:25 才开始,scheduleAtFixedRate 的周期全乱了。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,调度池 newScheduledThreadPool(1) 只有一个线程,任务之间串行执行。前一个任务跑 20 多分钟,后面的只能等它让出线程。
「定时任务线程池」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:按任务数量把调度线程数调到 4 到 8 别用单线程;长任务单独放执行池 调度线程只负责触发;给每个任务加耗时打点 超过周期就告警;观察两轮整点执行时间 确认偏差在秒级。
改完只确认一件事:六个任务都在整点后 10 秒内开始,连续两轮没有累积偏移。
