2015-11-19 23 views
2

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

我已阅读here JobScope和StepScope作业在关闭时播放效果不佳。

该文章建议不要使用JobScope或StepScope,但我不禁想到这是一个解决的问题,人们必须在应用程序退出时执行某些操作来防止此问题。

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

我们正在使用弹簧批处理版本3.0.3.RELEASE

+0

范围在引用的文章中的问题不负责停止不起作用,那里的作业配置只是明显错误(范围不使用,并在提供的示例中没有用) –

回答

3

我将为您提供关于如何解决此方案的想法。不一定是一个弹簧批量解决方案。

每次我需要在一个应用程序中添加的工作我这样做,因为这:

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

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

你应该知道的一件事是谨慎对待你的工作优先级,如果你管理错误,你可能会遇到饥饿问题。

您可以轻松地将此解决方案适应于弹簧式批处理。

希望它有帮助。

+0

我感谢您花时间给我一个深思熟虑的答案。我可以通过将所有状态设置为ABORTED来实现我自己的解决方案,如果它们在应用程序启动时设置为STARTING或STARTED,可能在Spring中使用ServletContextListener或某种启动监听器。我希望有一个更优雅的解决方案。再次感谢评论。 –

相关问题