java - 在 Play 2.1 (Java) 中运行后台任务的正确方法是什么?

标签 java playframework-2.0 akka

在我的应用程序中,我需要处理上传的文档并将处理结果放入数据库中。
文档存储在文件系统中,元数据存储在数据库中。
对于每个文档,需要从磁盘打开和处理文件,然后相应地更新数据库中的元数据。处理可能会很昂贵并且需要很长时间。
我打算做的是:

  1. 跨N个任务,一个任务处理单个文档
  2. 每个任务都会查找最旧的“未处理”文档
  3. 任务将在数据库中将其标记为“正在进行”并开始处理
  4. 处理文档任务后将更新元数据并将其在数据库中标记为“已处理”
  5. 此后任务将转到第 2 步

假设应用程序是用 Java 而不是 Scala 编写的,那么利用 Play 和 Akka 实现这一点的正确/最简单的方法是什么?源代码示例也将受到赞赏。

最佳答案

正确的方法是“不要在 Play 应用中运行任何后台任务”。 Play 是一个用于编写 Web 应用程序的 Web 框架,根据定义,后台任务不使用 Web 界面。因此,设置一个单独的后台任务运行程序并通过 Akka 向其发送消息/事件。事实上,如果您将尽可能多的业务逻辑推送到后台任务中,您将拥有一个可扩展性更高的应用程序。

有关此模型得出逻辑结论的示例,请查看 Mongrel2 Web 服务器 http://mongrel2.org/manual/book-final.html

鉴于我们在 JVM 世界中拥有 Akka 和 Camel 等工具,并且 Play 等框架正在让我们摆脱 servlet 架构,我认为是时候追随 Mongrel2 的领导,回到更多的 3 层架构,其中 Web 应用层只做最少的工作。

如果您遵循此架构,则可以将运行后台任务所需的所有信息捆绑到一条消息中,将其发送到执行该工作的外部参与者,然后可能让该参与者向另一个将更新数据库的参与者发送完成消息。

关于java - 在 Play 2.1 (Java) 中运行后台任务的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379252/

相关文章:

java - 如何修改 JComponent 的 setBounds 方法?

java - 是否有可能在 Caffeine 中获取候选被逐出 key 集?

java - play.data.Form.Field 到 play.data.Form[models.xxxx] 可能吗?

java - Patterns.ask 超时后消息将转到哪里?

scala - 跨 Akka 集群同步数据的简单方法?

java - 非重写方法不显示子类字段

java - Apache Camel Ftp 消费者并发支持

scala - 无法让 sbt-concat 捆绑来自 sbt-sass 或 sbt-less 的样式

scala - 如何在 Scala 的 Play!2 中的表单中包含图片类型?

scala - 玩!斯卡拉 : How to disable actor modules loaded at the start of the application when testing?