为什么计划的方法在 spring 启动时随机停止?

Why are scheduled methods randomly stopping in spring boot?

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

我的日志没有显示任何 errors/server 崩溃,就像 spring 引导决定不再执行任何 @scheduled 方法一样。

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

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

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

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

我尽量包含有用的信息,如果有什么不对clear/missing,请告诉我。

除此之外,关于如何调试或可能导致此问题的原因有什么想法吗?

我遇到的问题很独特,张贴答案以防将来对某人有帮助。

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

  2. 由于 Spring 上的调度默认是单线程的,因此有一个优化不佳的方法调用需要大约 12 小时才能完成,这会使它看起来像自从日志没有更新,其他地方也没有自动化。

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

我是怎么发现的: 在我的例子中,我的应用程序在容器中运行,一旦它运行我就 CTRL + Z。 我有一种感觉,记录器无法正常工作,所以一旦记录器文件停止更新,所以我决定通过键入 fg 来检查应用程序的实时日志记录,并意识到即使日志文件不是'未更新,服务器仍然 运行 正常。