为什么计划的方法在 spring 启动时随机停止?
Why are scheduled methods randomly stopping in spring boot?
我有大约 20 种预定的自动化方法。他们都 运行 很好,但他们都在几个小时后停止了。
我的日志没有显示任何 errors/server 崩溃,就像 spring 引导决定不再执行任何 @scheduled
方法一样。
我的第一直觉是方法主体中可能存在无限循环,但是,我所有的方法在开始和结束时都有记录器。也就是说,如果我们有一个无限循环,我的最终日志就不会说 [foo finished successfully]
.
我什至创建了一个每 5 分钟打印一次的测试仪,几个小时后该功能也停止了,所有其他功能也停止了。
我的第二个直觉是检查文件大小,因为文件大小可能太大,记录器刚刚停止登录文件,不知何故这使自动化停止(此时刮桶),但由于自动化只 运行 几个小时,文件大小只有 ~1200kb,所以这不是问题。
基本上,由于我的记录器的设置方式,我不认为某处存在无限循环,我的日志中没有收到任何错误消息,而且我不知道如何调试它。
我尽量包含有用的信息,如果有什么不对clear/missing,请告诉我。
除此之外,关于如何调试或可能导致此问题的原因有什么想法吗?
我遇到的问题很独特,张贴答案以防将来对某人有帮助。
Loggers 停止写入文件,即使它们不是故意的。 (另一个问题我最终会解决)这意味着即使最后一个日志说 [foo finished successfully]
,它也一定是应用程序的最后一个真实日志。
由于 Spring 上的调度默认是单线程的,因此有一个优化不佳的方法调用需要大约 12 小时才能完成,这会使它看起来像自从日志没有更新,其他地方也没有自动化。
我永远不会让这个 ~12h 方法调用完成,如果我等了 12h,我就会意识到自动化并没有停止,它只是有一个瓶颈方法。我总是会在此方法完成之前重新启动自动化,这使得它看起来好像自动化确实因未知原因停止了。
我是怎么发现的: 在我的例子中,我的应用程序在容器中运行,一旦它运行我就 CTRL + Z
。
我有一种感觉,记录器无法正常工作,所以一旦记录器文件停止更新,所以我决定通过键入 fg
来检查应用程序的实时日志记录,并意识到即使日志文件不是'未更新,服务器仍然 运行 正常。
我有大约 20 种预定的自动化方法。他们都 运行 很好,但他们都在几个小时后停止了。
我的日志没有显示任何 errors/server 崩溃,就像 spring 引导决定不再执行任何 @scheduled
方法一样。
我的第一直觉是方法主体中可能存在无限循环,但是,我所有的方法在开始和结束时都有记录器。也就是说,如果我们有一个无限循环,我的最终日志就不会说 [foo finished successfully]
.
我什至创建了一个每 5 分钟打印一次的测试仪,几个小时后该功能也停止了,所有其他功能也停止了。
我的第二个直觉是检查文件大小,因为文件大小可能太大,记录器刚刚停止登录文件,不知何故这使自动化停止(此时刮桶),但由于自动化只 运行 几个小时,文件大小只有 ~1200kb,所以这不是问题。
基本上,由于我的记录器的设置方式,我不认为某处存在无限循环,我的日志中没有收到任何错误消息,而且我不知道如何调试它。
我尽量包含有用的信息,如果有什么不对clear/missing,请告诉我。
除此之外,关于如何调试或可能导致此问题的原因有什么想法吗?
我遇到的问题很独特,张贴答案以防将来对某人有帮助。
Loggers 停止写入文件,即使它们不是故意的。 (另一个问题我最终会解决)这意味着即使最后一个日志说
[foo finished successfully]
,它也一定是应用程序的最后一个真实日志。由于 Spring 上的调度默认是单线程的,因此有一个优化不佳的方法调用需要大约 12 小时才能完成,这会使它看起来像自从日志没有更新,其他地方也没有自动化。
我永远不会让这个 ~12h 方法调用完成,如果我等了 12h,我就会意识到自动化并没有停止,它只是有一个瓶颈方法。我总是会在此方法完成之前重新启动自动化,这使得它看起来好像自动化确实因未知原因停止了。
我是怎么发现的: 在我的例子中,我的应用程序在容器中运行,一旦它运行我就 CTRL + Z
。
我有一种感觉,记录器无法正常工作,所以一旦记录器文件停止更新,所以我决定通过键入 fg
来检查应用程序的实时日志记录,并意识到即使日志文件不是'未更新,服务器仍然 运行 正常。