【问题标题】:Best way to schedule very long running process from Spring MVC servlet从 Spring MVC servlet 安排非常长时间运行的进程的最佳方法
【发布时间】:2015-11-14 13:49:12
【问题描述】:

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

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

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

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

我不知道,也许这是“基于意见”,但这种情况可能很常见,我想知道一个典型的好解决方案,应该考虑专业实施。

【问题讨论】:

  • 如果你想重启你的servlet而不影响长时间运行的进程,那么你只有一个选择——创建另一个使用Spring批处理或Linux Cron运行的Java程序。 (问题是基于意见的)
  • 如果您想听听意见:我认为单独的应用程序会很好,因为您可以关闭或重新启动您的 spring mvc 应用程序而无需担心或尝试使用 static 破解系统(其中我认为行不通)。这可能取决于您的环境,第二个应用程序部署到应用程序服务器、机器上本地的新独立(服务器/cron)进程或工作集群中的新微服务。 “您的环境”通常与其他任何人的环境如此不同,以至于没有一种典型的好解决方案。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多