【问题标题】:Why are scheduled methods randomly stopping in spring boot?为什么预定的方法会在 Spring Boot 中随机停止?
【发布时间】:2020-10-20 01:54:45
【问题描述】:

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

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

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

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

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

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

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

除此之外,关于如何调试或可能导致此问题的任何想法?

【问题讨论】:

  • 没有看到你的配置很难说。但是,我建议检查您的内存和可用线程的数量。我有一种感觉,你不能再构造线程(并且正在使用“错误”TaskScheduler),因此症状是不再执行。

标签: java spring spring-boot scheduled-tasks


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2011-01-29
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多