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