我们正在开发一个应用程序,该应用程序需要处理存储在DB中的多行巨大文件。处理可以在多个JMS客户端之间进行拆分,这样每个客户端都可以获得自己的共享来独立处理。如何确定是否所有JMS客户端都已完成其部分?一旦所有JMS客户端完成任务,我们就需要触发处理流程中的另一个步骤。我们使用MDB作为JMS客户端。
事实上,我们正在数据库中收集单个任务的状态。但没有这样的大师。水流看起来是这样的。
-
系统的一部分以块的形式接收文件并保存在DB中。
-
下一步从逻辑上将该文件拆分为N个分区,并将分区的元数据作为JMS消息发送。
-
然后,JMS客户端处理其文件部分,当它们完成时,它们会更新DB中另一个表上的任务状态。
但是如何可能触发下一步?一个JMS客户端将如何知道所有其他客户端已经完成了它们的部分。或者我怎么能在这里雇佣一位大师?
您可以在应用程序级别执行此操作。每个工作人员应在完成任务时创建通知。您可以将通知推送到特殊的JMS队列,也可以将其存储在数据库中。这取决于您的应用程序。通知应该包含由创建任务的经理创建的任务ID。所以其他组件(或管理器)可以检查是否所有创建的任务都已终止。
使用Blackboard体系结构模式将部分解决方案注册到所有子流程可能很有用。看看这篇文章,或者在谷歌上搜索更多信息。
我会让JMS客户端以最快的速度提取数据。例如,创建一个名为FooDataSourceRequest
的队列,客户端可以在这里发布消息来请求一些数据,然后再创建另一个称为FoodDataSourceResponse
的队列,将包含数据的响应消息放在那里。
您可以使用jms Reply-To队列或相关ID来让数据消费者获取他们的数据。通过这种方式,您可以有一个JMS生产者负责跟踪要处理的下一个区块is
有趣的部分是跟踪哪些chunck被处理,哪些没有,您可能需要使用分布式事务将数据放入队列并更新数据库。。。等
这篇DZone发表的文章概述了如何使用JGroups来实现类似的模型。作者的意图是展示在JMS实现中使用JGroups的一些好处,但作为一种通用模式,它有很好的文档记录,因此您可能会发现它很有用。