Spring @Scheduled 第一次触发了但第二次没触发

最近遇到一个奇怪的问题,有一个应用,分主从两个节点,从节点启动时会阻塞等待切换成主节点的通知,两个节点每天晚上会停止(进程没停,只是业务停止),第二天早上又会启动,这个用了spring的@Scheduled去做,但实践中发现第一天晚上正常按时停止,但第二天从节点没按时停止,而住节点则正常停止,这导致了从节点切换成了住节点,然后奇怪的是从节点变成住节点启动后马上又按照schedule停止了。

经过调查最终发现,这是因为spring @Scheduled默认只有一个线程运行所有任务,第一天启动是直接启动应用时启动的,并没有通过schedule,到了一天晚上停止时才第一次用schedule,这一次正常运行,到了第二天从节点用schedule运行启动,但这个任务被阻塞了,一直没完成,这导致了到了第二天晚上从节点没有线程去运行停止这个任务,等到从节点切换成住节点解除了阻塞状态,把schedule的线程空出来了,所以马上停止任务就可以运行了。

我把线程池大小调成2后就正常工作了。但一般来讲线程池运行的任务最好是类型或大小都相似的,而且任务不应该有阻塞,这样才能有效率以及避免错误。

猜你喜欢

转载自www.cnblogs.com/gzedwin/p/11482014.html