2

我们正在开发一个应用程序,该应用程序需要处理存储在多行数据库中的巨大文件。可以将处理拆分到多个 JMS 客户端,以便每个客户端都有自己的共享来使用并独立进行处理。如何确定是否所有 JMS 客户端都完成了他们的部分?一旦所有 JMS 客户端完成其任务,我们需要触发处理流程中的另一个步骤。我们使用 MDB 作为 JMS 客户端。

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

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

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

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

但是怎么可能触发下一步呢?一个 JMS 客户端如何知道所有其他客户端已完成其部分。或者我怎么能在这里雇佣一个大师?

4

4 回答 4

1

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

于 2012-12-11T19:05:20.833 回答
1

使用 Blackboard 架构模式为所有子流程注册部分解决方案可能很有用。看看这篇文章,或谷歌它以获取更多信息。

于 2012-12-11T19:07:04.947 回答
1

我会让 JMS 客户端尽可能快地处理数据。例如,创建一个名为FooDataSourceRequestthis 的队列,客户端可以在其中发布消息以请求一些数据,然后创建另一个名为的队列FoodDataSourceResponse,其中放置带有数据的响应消息。

您可以使用 jms 回复队列或关联 ID 让数据消费者获取他们的数据。通过这种方式,您可以拥有一个负责跟踪要处理的下一个块的 JMS 生产者。

有趣的部分是跟踪哪些块已处理,哪些未处理,您可能需要使用分布式事务将数据放入队列并更新数据库......等等?

于 2012-12-11T19:33:44.987 回答
1

这篇DZone 发布的文章概述了如何使用 JGroups 来实现类似的模型。作者的意图是展示使用 JGroups 优于 JMS 实现的一些好处,但作为一种通用模式,它有很好的文档记录,因此您可能会发现它很有用。

于 2012-12-11T20:27:53.913 回答