2013-05-04 59 views
1

在我的应用程序中,我需要处理上传的文档并将处理结果放在数据库中。
文档存储在文件系统中,元数据存储在数据库中。
对于每个文档,需要打开并处理来自磁盘的文件,而不是相应地更新数据库中的元数据。处理可能是昂贵的并且需要很长时间。
我打算做的是:在Play 2.1(Java)中运行后台任务的正确方法是什么?

  1. 跨度N个任务,一个任务来处理一个文档
  2. 每个任务将去寻找最古老的,“未处理”文件
  3. 任务将其标记为”进取”的数据库,并开始处理它
  4. 文档处理任务后,将更新元数据,并在数据库将其标记为‘已处理’
  5. 任务会是
后第2步

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

回答

1

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

对于这个模型所得出的逻辑结论的一个例子,有一个看看Mongrel2 Web服务器http://mongrel2.org/manual/book-final.html

由于我们有像阿卡和骆驼在JVM世界的工具,而像游戏框架正在断奶我认为现在是时候遵循Mongrel2的标准,并回到更多的三层架构中,在这种架构中,网络应用层只做最少的工作。

如果你遵循这个架构,你需要把运行后台任务所需的所有信息都捆绑到一个消息中,然后把它发送给一个执行工作的外部角色,然后让该角色向另一个角色发送完成消息这将更新数据库。

+0

Michael,你显然是对的,但这只是一个原型应用程序,它将运行在单个JVM实例上。我的理解是,Play使用Akka,并提供服务请求和我自己的任务 - 所有这些只是来自Akka视角的不同演员执行的任务。所以我甚至在想,“在Play应用程序中”实际上是“在Akka”中? – 2013-05-05 07:20:15

+0

对。使用Akka库。 Sen消息。让演员执行后台任务。但为了简洁的设计,假设演员不会在同一台机器上。实际上,为什么不为后台任务执行者启动第二个JVM。这可以帮助您创建一个可以扩展到1000台机器的干净设计。 – 2013-05-05 08:52:47

相关问题