我有一个JavaSpring(MVC)servlet,我需要创建一个缓慢、长时间运行的进程,随着时间的推移在数据库中创建条目。servlet应该提供数据库内容的视图,以及有关进程状态的一些信息。
这个过程不是计算密集型的,但需要很长时间。在servlet运行时,我很可能需要多次重新启动它。该过程能够生成检查点,但必须调用已知的代码才能生成和应用它们。该过程在数据库中创建条目,以这种方式监视其活动是可能的,也是必需的。
到目前为止,我考虑了以下想法:
- 一个单独的Java程序,由Linux Cron控制
- ExecutorService,附加到servlet类内的静态字段
- 一个从@PostConstruct方法启动活动的Spring bean
- Spring Batch框架可能是可能的,但我不确定它是否对我所需要的来说太重
我不知道,也许这是"基于意见的",但这种情况可能很频繁,我想知道一个典型的好解决方案,应该被认为是专业实施的。
由于您可能会重新启动Servlet,实际上是应用程序,甚至是整个容器过程,因此您应该将长期运行的作业安排在当前Servlet/应用程序/容器之外。
最好的方法是将作业安排在另一个过程中。您可以推出自己的解决方案,但有些平台已经实现了这一点,Gearman就是一个例子,Spring XD就是另一个例子。
基本思想是将作业移交给作业队列,并让(理想情况下)分布式作业调度程序处理该队列。该调度程序反过来会提供API或事件源来通知(即发布订阅队列)您的应用程序进度。
理想情况下,作业本身将使用批处理框架(如Spring Batch或JSR 352 Batch Applications)来实现。两者都提供检查点,因此可以从检查点重新启动作业。