从Spring MVC servlet安排非常长的运行过程的最佳方法

时间:2015-11-14 13:49:12

标签: java spring servlets scheduler long-running-processes

我有一个Java Spring(MVC)servlet,我需要创建一个缓慢,长时间运行的进程,该进程将随着时间的推移在数据库中创建条目。 servlet应该提供数据库内容的视图,以及有关进程状态的一些信息。

这个过程不是计算密集型的,但需要很长时间。我很可能需要在运行时多次重启servlet。该过程能够制作检查点,但必须调用已知代码来制作和应用它们。该过程在数据库中创建条目,并且可以并且需要以这种方式监视其活动。

到目前为止,我考虑以下想法:

  • 由Linux Cron控制的单独Java程序。
  • 一个ExecutorService,附加到servlet类中的静态字段。
  • 从@PostConstruct方法启动活动的Spring bean。
  • Spring Batch框架可能是可能的,但我不确定它是否对我所需的不太重。

我不知道,也许这是基于意见的#34;但情况可能很频繁,我想知道一个应该被视为专业实施的典型好解决方案。

1 个答案:

答案 0 :(得分:3)

由于您可能会重新启动Servlet,实际上是应用程序甚至是整个容器进程 - 您应该在当前的Servlet /应用程序/容器之外安排长时间运行的作业。

最好的方法是在另一个流程中安排工作。您可以推出自己的解决方案,但有些平台已经完全实现了这一点,Gearman就是一个例子,Spring XD是另一个例子。

基本思想是将作业切换到作业队列,并且(理想情况下)分布式作业调度程序处理队列。该调度程序将提供API或事件源来通知(即发布 - 订阅队列)您的应用程序进度。

理想情况下,作业本身可以使用批量框架来实现,例如Spring BatchJSR 352 Batch Applications。两者都提供检查点,因此可以从检查点重新启动您的工作。