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

时间:2013-05-04 21:42:19

标签: java playframework-2.0 akka

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

  1. 跨越N个任务,一个处理单个文档的任务
  2. 每项任务都将找到最早的“未经处理”文档
  3. 任务会在数据库中将其标记为“正在进行中”并开始处理
  4. 处理完文档后,任​​务将更新元数据,并在DB中将其标记为“已处理”
  5. 任务将在此之后转到第2步
  6. 实现这个利用Play和Akka的正确/最简单的方法是假设应用程序是用Java编写的,而不是Scala?源代码示例也将受到赞赏。

1 个答案:

答案 0 :(得分:1)

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

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

鉴于我们在JVM世界中拥有像Akka和Camel这样的工具,并且像Play这样的框架让我们摆脱了servlet体系结构,我认为现在是时候关注Mongrel2的领导并回到更多的3层体系结构Web应用程序层只能完成最少的工作。

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