【问题标题】:Shutting down spring batch jobs gracefully in tomcat在tomcat中优雅地关闭spring批处理作业
【发布时间】:2015-11-19 05:06:13
【问题描述】:

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

我读过here,JobScope 和 StepScope 作业不能很好地关闭。

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

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

我们使用的是 spring-batch 版本 3.0.3.RELEASE

【问题讨论】:

  • 范围 参考文章中的问题不负责 STOP 不起作用,那里的作业配置完全错误(范围未使用且在提供的示例中无用)

标签: java spring tomcat spring-batch


【解决方案1】:

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

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

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

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

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

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

希望对你有帮助。

【讨论】:

  • 感谢您抽出宝贵时间给我一个深思熟虑的答案。我可以通过将所有状态设置为 ABORTED 来实现我自己的解决方案,如果它们在应用程序启动时设置为 STARTING 或 STARTED,可能使用 ServletContextListener 或 Spring 中的某种启动侦听器。我希望有一个更优雅的解决方案。再次感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多