我可以在 Spring Boot 应用程序中运行长任务吗?
Posted
技术标签:
【中文标题】我可以在 Spring Boot 应用程序中运行长任务吗?【英文标题】:Can I run long tasks in a Spring Boot application? 【发布时间】:2016-01-08 06:41:04 【问题描述】:我有一个 Spring Boot 应用程序,它在 AngularJS 页面上显示来自 MongoDB 的一些数据,并允许用户更改它。
现在我需要创建一个机制,让我可以
-
运行长时间(1-3 小时)的 Java 方法,
生成一些文件和
通过网络观察其状态(是否运行、是否完成、是否崩溃?)。
我可以在 Spring Boot 应用程序的范围内实现这个吗?如果是,我可以使用 Spring 的哪些部分来做到这一点?
【问题讨论】:
【参考方案1】:我认为将批处理嵌入到您的服务中并不是一个好主意,这会暴露 MongoDB 数据存储。
我会创建单独的批处理应用程序。如果您使用 Spring 堆栈,Spring Batch 将是自然选择。您需要弄清楚如何托管 Spring Batch 作业以及如何触发和安排它。 Spring Batch 的元数据需要 SQL 存储。
批处理的状态可以由另一个在 Servlet 容器上运行 Spring Batch Admin module 的应用程序监控。如果将此应用程序指向 Spring Batch 作业应用程序的 SQL 存储,您将获得通过开箱即用的 Web UI 监控状态。
当然它可以使用 Spring Boot 运行每个应用程序。
如果您不想处理它为托管三个应用程序带来的这种操作复杂性,您仍然可以将这三个应用程序嵌入到一个中,并且它可以与 Spring Boot 一起正常工作。您甚至可以手动执行带有参数的作业,或者通过配置为可以访问 Spring Batch Job bean 的 Spring Batch Admin 重新启动它们。
您还可以探索使用 MongoDb 作为 Spring Batch 元数据的存储。 E.g. this project may help。但是这样的机制需要被 Spring Batch 应用程序和 Spring Batch Admin 模块可视化处理状态使用。
【讨论】:
谢谢。关于 SQL 存储:H2、Derby 之类的轻量级数据库是否足以满足 Spring Batch 的需求? 是的。尽管您可能希望避免在内存数据库中使用。 Spring Batch 100% 支持存储在文件中的 H2 或 Derby。 顺便说一句,我已经为我正在编写的即将出版的书创建了一堆关于 Spring Batch 框架的示例。示例主要使用 Spring Boot 和 H2 作为元数据的存储:github.com/lkrnac/book-eiws-code-samples/tree/master/09-batch以上是关于我可以在 Spring Boot 应用程序中运行长任务吗?的主要内容,如果未能解决你的问题,请参考以下文章
在线程中运行长时间的 Python 计算,并记录到 Qt 窗口,片刻后崩溃
在由 docker 拉取的 Spring Boot 应用程序中实现 LetsEncrypt