首页 > 解决方案 > 为什么预定的方法会在 Spring Boot 中随机停止?

问题描述

我有大约 20 种预定的自动化方法。它们都运行良好,但几个小时后它们都停止了。

我的日志没有显示任何错误/服务器崩溃,就好像 spring boot 决定不再执行任何@scheduled方法一样。

我的第一个直觉是方法体中可能存在无限循环,但是,我所有的方法在开始和结束时都有记录器。即如果我们有一个无限循环,我的最终日志不会说[foo finished successfully]

我什至创建了一个每 5 分钟打印一次的测试仪,几个小时后,该功能也停止了,其他所有功能也停止了。

我的第二个直觉是检查文件大小,因为可能文件大小太大并且记录器刚刚停止登录文件,并且不知何故这使得自动化停止(此时刮掉桶),但因为自动化只运行几个小时后,文件大小只有~1200kb,所以这不是问题。

基本上,由于我的记录器的设置方式,我认为某处没有无限循环,我的日志中没有收到任何错误消息,我不知道如何调试它。

我试图包含尽可能多的有用信息,如果有什么不清楚/遗漏,请告诉我。

除此之外,关于如何调试或可能导致这种情况的任何想法?

标签: javaspringspring-bootscheduled-tasks

解决方案


我遇到的问题非常独特,发布答案以防将来对某人有所帮助。

  1. 记录器停止写入文件,即使它们不是故意的。(我最终会解决的另一个问题)这意味着即使最后一个日志说[foo finished successfully],它也一定是应用程序的最后一个真实日志。

  2. 由于默认情况下 Spring 上的调度是单线程的,因此存在一个优化不佳的方法调用,需要大约 12 小时才能完成,这会使自动化停止,因为日志没有更新并且其他地方没有发生自动化。

  3. 我永远不会让这个 ~12 小时的方法调用完成,如果我等了 12 小时,我会意识到自动化并没有停止,它只是有一个瓶颈方法。我总是会在此方法完成之前重新启动自动化,这看起来好像自动化确实因未知原因停止了。

我是如何发现的:在我的情况下,我的应用程序在一个容器中运行,一旦它运行,我只是CTRL + Z. 我感觉记录器不能正常工作,所以一旦记录器文件停止更新,所以我决定通过键入检查应用程序的实时日志记录,fg并意识到即使日志文件没有更新,服务器仍然运行良好。


推荐阅读