在tomcat中正常关闭spring批处理作业

时间:2015-11-19 05:06:13

标签: java spring tomcat spring-batch

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

我已阅读here,JobScope和StepScope作业无法正常关闭。

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

是否有一些处理此方案的最佳做法?你在申请中做了什么?

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

1 个答案:

答案 0 :(得分:3)

我将就如何解决此问题向您提供想法。不一定是弹簧批解决方案。

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

  1. 创建一个表来控制作业(队列,优先级,状态等)
  2. 创建JobController课程以管理所有工作
  3. 所有工作都由状态R定义 - 正在运行,F - 已完成,Q - 队列(您可以根据需要添加更多内容,如中止,取消等)(工作控制这些状态)
  4. jobController只能加载一次,你可以将它定义为这个
  5. 的spring bean
  6. JobController添加布尔属性,以通知您在实例化时是否已检查作业。将其设置为false
  7. 检查是否存在具有R状态的作业,这意味着在服务器的最后一站中它们正在运行,因此您将具有此R状态的每个作业更新为Q并提高其优先级,以便它将在重新启动服务器后首先执行。在检查将其设置为true之后,此检查位于该布尔属性的if内。
  8. 这样,每当你第一次调用JobController并且服务器崩溃时有未完成的作业时,你就可以将all设置为可以再次执行的状态。此检查只会发生一次,因为您将检查该布尔属性。

    你应该注意的一点是谨慎对待你的工作,如果你管理错了,你可能会遇到饥饿问题。

    您可以轻松地将此解决方案调整为弹簧批。

    希望它有所帮助。