Java 在tomcat中优雅地关闭spring批处理作业

Java 在tomcat中优雅地关闭spring批处理作业,java,spring,tomcat,spring-batch,Java,Spring,Tomcat,Spring Batch,我们在提供UI的同一个web应用程序中运行tomcat中的几个spring批处理作业。最近,我们添加了更多的工作,我们注意到,当我们修补应用程序时,一些工作可能会陷入启动或已启动状态。许多作业在启动前确保另一个作业未运行,因此这意味着在修补服务器后,一些作业会中断,直到手动运行SQL以更新作业的状态,使其处于放弃或停止状态 我已经读到JobScope和StepScope作业与关闭不太协调 那篇文章建议不要使用JobScope或StepScope,但我忍不住认为这是一个已解决的问题,当应用程序退出

我们在提供UI的同一个web应用程序中运行tomcat中的几个spring批处理作业。最近,我们添加了更多的工作,我们注意到,当我们修补应用程序时,一些工作可能会陷入启动或已启动状态。许多作业在启动前确保另一个作业未运行,因此这意味着在修补服务器后,一些作业会中断,直到手动运行SQL以更新作业的状态,使其处于放弃或停止状态

我已经读到JobScope和StepScope作业与关闭不太协调

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

是否有一些处理此场景的最佳实践?你在应用程序中做什么


我们正在使用SpringBatch版本3.0.3。发布版

我将为您提供一个关于如何解决此场景的想法。不一定是spring批处理解决方案

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

  • 创建一个表来控制作业(队列、优先级、状态等)
  • 创建一个
    JobController
    类来管理所有作业
  • 所有作业都由状态
    R
    -运行、
    F
    -完成、
    Q
    -队列定义(您可以根据需要添加更多作业,如中止、取消等)(作业控制这些状态)
  • jobController只能加载一次,您可以为此将其定义为Springbean
  • 将布尔属性添加到
    JobController
    ,以通知您在实例化作业时是否已检查作业。将其设置为false
  • 检查是否有具有R状态的作业,这意味着在服务器的最后一次停止时,它们正在运行,因此您可以使用此
    R
    状态将每个作业更新为
    Q
    ,并增加它们的优先级,以便在服务器重新启动后首先执行。此检查位于该布尔属性的
    if
    内,检查后将其设置为true
  • 这样,每次您第一次调用JobController时,如果服务器崩溃导致未完成的作业,则可以将所有作业都设置为可再次执行的状态。这个检查只会发生一次,因为您要检查布尔属性

    你应该注意的一件事是,要注意你的工作重点,如果你管理不当,你可能会遇到饥饿问题

    您可以轻松地将此解决方案应用于spring批处理


    希望能有所帮助。

    参考文章中的范围问题并不是停止工作的原因,那里的作业配置完全错误(在提供的示例中,范围未使用,也没有用处)。我感谢您抽出时间给我一个深思熟虑的答案。我可以实现我自己的解决方案,将所有状态设置为中止,如果它们设置为启动或在应用程序启动时启动,可以使用ServletContextListener或Spring中的某种启动侦听器。我希望有一个更优雅的解决方案。再次感谢您的评论。