gpt4 book ai didi

java - 在 tomcat 中优雅地关闭 spring batch 作业

转载 作者:行者123 更新时间:2023-11-30 08:07:15 25 4
gpt4 key购买 nike

我们在为我们的 UI 提供服务的同一 Web 应用程序中的 tomcat 中运行多个 spring 批处理作业。最近我们一直在添加更多的工作,我们注意到当我们修补我们的应用程序时,一些工作可能会卡在 STARTING 或 STARTED 状态。其中许多作业会确保其他作业在它们启动之前没有运行,因此这意味着在我们修补服务器之后,我们的一些作业会被破坏,直到我们手动运行 SQL 将作业的状态更新为 ABANDONED 或 STOPPED。

我已阅读 here JobScope 和 StepScope 作业在关闭时表现不佳。

那篇文章建议不要使用 JobScope 或 StepScope,但我不禁认为这是一个已解决的问题,人们必须在应用程序退出时做一些事情来防止这个问题。

是否有一些处理这种情况的最佳做法?您在应用程序中做什么?

我们正在使用 spring-batch 版本 3.0.3.RELEASE

最佳答案

我将为您提供一个关于如何解决这种情况的想法。不一定是 spring-batch 解决方案。

每次我需要在应用程序中添加作业时,我都会这样做:

  1. 创建一个表来控制作业(队列、优先级、状态等)
  2. 创建一个 JobController 类来管理所有作业
  3. 所有作业都由状态定义 R-running,F-Finished,Q-Queue(您可以根据需要添加更多例如中止、取消等)(作业控制这些状态)
  4. jobController 必须只加载一次,为此您可以将其定义为 spring bean
  5. 将 boolean 属性添加到 JobController 以通知您在实例化它时是否已经检查了作业。将其设置为假
  6. 检查是否有 R 状态的作业,这意味着它们在服务器的最后一站运行,因此您将具有此 R 状态的每个作业更新为 Q并增加它们的优先级,以便在服务器重新启动后首先执行。此检查位于该 boolean 属性的 if 内,检查后将其设置为 true。

这样,每次您第一次调用 JobController 并且服务器崩溃导致未完成的作业时,您都可以将所有作业设置为可以再次执行的状态。而且此检查只会发生一次,因为您将检查该 boolean 属性。

你应该注意的是你的工作优先级要谨慎,如果你管理不当,你可能会遇到饥饿问题。

您可以轻松地将此解决方案应用于 spring-batch。

希望对您有所帮助。

关于java - 在 tomcat 中优雅地关闭 spring batch 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33795647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com