java - 为什么预定的方法会在 Spring Boot 中随机停止?
问题描述
我有大约 20 种预定的自动化方法。它们都运行良好,但几个小时后它们都停止了。
我的日志没有显示任何错误/服务器崩溃,就好像 spring boot 决定不再执行任何@scheduled
方法一样。
我的第一个直觉是方法体中可能存在无限循环,但是,我所有的方法在开始和结束时都有记录器。即如果我们有一个无限循环,我的最终日志不会说[foo finished successfully]
。
我什至创建了一个每 5 分钟打印一次的测试仪,几个小时后,该功能也停止了,其他所有功能也停止了。
我的第二个直觉是检查文件大小,因为可能文件大小太大并且记录器刚刚停止登录文件,并且不知何故这使得自动化停止(此时刮掉桶),但因为自动化只运行几个小时后,文件大小只有~1200kb,所以这不是问题。
基本上,由于我的记录器的设置方式,我认为某处没有无限循环,我的日志中没有收到任何错误消息,我不知道如何调试它。
我试图包含尽可能多的有用信息,如果有什么不清楚/遗漏,请告诉我。
除此之外,关于如何调试或可能导致这种情况的任何想法?
解决方案
我遇到的问题非常独特,发布答案以防将来对某人有所帮助。
记录器停止写入文件,即使它们不是故意的。(我最终会解决的另一个问题)这意味着即使最后一个日志说
[foo finished successfully]
,它也一定是应用程序的最后一个真实日志。由于默认情况下 Spring 上的调度是单线程的,因此存在一个优化不佳的方法调用,需要大约 12 小时才能完成,这会使自动化停止,因为日志没有更新并且其他地方没有发生自动化。
我永远不会让这个 ~12 小时的方法调用完成,如果我等了 12 小时,我会意识到自动化并没有停止,它只是有一个瓶颈方法。我总是会在此方法完成之前重新启动自动化,这看起来好像自动化确实因未知原因停止了。
我是如何发现的:在我的情况下,我的应用程序在一个容器中运行,一旦它运行,我只是CTRL + Z
. 我感觉记录器不能正常工作,所以一旦记录器文件停止更新,所以我决定通过键入检查应用程序的实时日志记录,fg
并意识到即使日志文件没有更新,服务器仍然运行良好。
推荐阅读
- python - 获取列表中可用的免费余额
- kubernetes - 在 kustomization.yaml 中排除资源
- twitter - 等待 Twitter 的 API 限制重置后再继续
- javascript - 如何计算输入栏的内容?- 反应JS
- vue.js - vue 3 使用 Vuex 和路由器的服务器端渲染
- java - 使用java从Array中过滤id值
- javascript - Vue.js 中 setInterval 的功能
- java - 编年史队列上的 StreamCorruptedException 使队列无法使用
- python - 为 9 Men Morris 游戏运行 Github 代码时出现 AttributeError
- firebase - 更新 Firestore 集合中的所有文档,但基于创建日期的预定义数字除外