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

在Play2.1(Java)中运行后台任务的正确方法是什么?,java,playframework-2.0,akka,Java,Playframework 2.0,Akka,在我的应用程序中,我需要处理上传的文档,并将处理结果放入数据库中。 文档存储在文件系统中,元数据存储在数据库中。 对于每个文档,需要从磁盘打开并处理文件,然后相应地更新数据库中的元数据。处理过程可能很昂贵,而且需要很长时间。 我计划做的是: 跨N个任务,一个任务处理单个文档 每个任务都将查找最旧的“未处理”文档 任务将在数据库中将其标记为“进行中”,并开始处理它 处理完文档后,任务将更新元数据,并在数据库中将其标记为“已处理” 之后,任务将转到步骤2 假设applicaton是用Java编写的,

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

  • 跨N个任务,一个任务处理单个文档
  • 每个任务都将查找最旧的“未处理”文档
  • 任务将在数据库中将其标记为“进行中”,并开始处理它
  • 处理完文档后,任务将更新元数据,并在数据库中将其标记为“已处理”
  • 之后,任务将转到步骤2
  • 假设applicaton是用Java编写的,而不是用Scala编写的,那么实现这种利用功能和Akka的正确/最简单的方法是什么?源代码示例也将不胜感激。

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

    关于这个模型的一个逻辑结论示例,请看一下Mongrel2Web服务器

    考虑到JVM世界中有Akka和Camel等工具,Play等框架正在使我们脱离servlet体系结构,我认为是时候效仿Mongrel2的做法,回到更多的三层体系结构,其中web应用层只做最少的工作

    如果遵循此体系结构,您将把运行后台任务所需的所有信息打包成一条消息,发送给执行此工作的外部参与者,然后可能的话,让该参与者将完成消息发送给另一个参与者,后者将更新数据库

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

    关于这个模型的一个逻辑结论示例,请看一下Mongrel2Web服务器

    考虑到JVM世界中有Akka和Camel等工具,Play等框架正在使我们脱离servlet体系结构,我认为是时候效仿Mongrel2的做法,回到更多的三层体系结构,其中web应用层只做最少的工作


    如果遵循此体系结构,您将把运行后台任务所需的所有信息打包成一条消息,发送给执行此工作的外部参与者,然后可能的话,让该参与者将完成消息发送给另一个参与者,后者将更新数据库

    Michael,你显然是对的,但这只是一个原型应用程序,它将在单个JVM实例上运行。我的理解是,这出戏是在使用Akka,而服务请求和我自己的任务——从Akka的角度来看,所有这些都只是由不同的演员执行的任务。所以我在想,即使我问“游戏中的应用程序”,事实上它是“在阿克卡”?对。使用Akka库。Sen消息。让参与者运行后台任务。但是为了简洁的设计,假设演员不在同一台机器上。事实上,为什么不为后台任务参与者启动第二个JVM呢。这有助于您创建一个干净的设计,可以扩展到1000台机器。Michael,您显然是对的,但这只是一个原型应用程序,它将在单个JVM实例上运行。我的理解是,这出戏是在使用Akka,而服务请求和我自己的任务——从Akka的角度来看,所有这些都只是由不同的演员执行的任务。所以我在想,即使我问“游戏中的应用程序”,事实上它是“在阿克卡”?对。使用Akka库。Sen消息。让参与者运行后台任务。但是为了简洁的设计,假设演员不在同一台机器上。事实上,为什么不为后台任务参与者启动第二个JVM呢。这有助于您创建一个干净的设计,可以扩展到1000台机器。