使用JMS的主工模式

时间:2012-12-11 19:01:32

标签: java design-patterns jms

我们正在开发一个应用程序,它需要处理多行存储在DB中的大文件。可以跨多个JMS客户端拆分处理,以便每个客户端获得自己的共享以便独立工作并进行处理。如何确定所有JMS客户端是否已完成其部分?所有JMS客户端完成任务后,我们需要在处理流程中触发另一个步骤。我们将MDB用作JMS客户端。

事实上,我们正在收集数据库上的各个任务状态。但是没有这样的大师。流程看起来像这样。

  1. 系统的一部分以块的形式接收文件并保存在DB中。

  2. 下一步将此文件逻辑拆分为N个分区,并将分区的元数据作为JMS消息发送。

  3. 然后JMS客户端处理它们的部分文件,完成后,它们会在DB中的另一个表上更新任务的状态。

  4. 但是如何触发下一步呢?一个JMS客户端将如何知道所有其他客户端已完成其部件。或者我如何在这里雇用一位大师?

4 个答案:

答案 0 :(得分:1)

您可以在应用程序级别执行此操作。每个工作人员应在完成任务时创建通知。您可以将通知推送到特殊JMS队列或将其存储在数据库中。这取决于您的应用程序。通知应包含创建任务的经理创建的任务ID。因此,其他组件(或管理员)可以检查是否已终止所有已创建的任务。

答案 1 :(得分:1)

使用Blackboard架构模式将部分解决方案注册到所有子流程可能很有用。请查看此article,或google以获取更多信息。

答案 2 :(得分:1)

我希望JMS客户端能够以尽可能快的速度处理数据。例如,创建一个名为FooDataSourceRequest的队列,这是客户端可以发布消息以请求某些数据的位置,然后是另一个名为FoodDataSourceResponse的队列,其中包含带有数据的响应消息。

您可以使用jms Reply To队列或核心化ID来让数据使用者获取其数据。这样,您就可以拥有一个负责跟踪要处理的下一个块的JMS生成器。

有趣的部分是跟踪哪些chuncks被处理,哪些不是,你可能需要使用分布式transacation将数据放入队列并更新数据库......等等?

答案 3 :(得分:1)

这个DZone published article概述了如何使用JGroups来实现类似的模型。作者的目的是展示使用JGroups而不是JMS实现的一些好处,但作为一般模式,它有很好的文档记录,因此您可能会发现它很有用。