websphereapplicationserver集群和JMS消息消耗

websphereapplicationserver集群和JMS消息消耗,jms,websphere,ibm-mq,cluster-computing,Jms,Websphere,Ibm Mq,Cluster Computing,我们正在开发一个将部署到WAS集群的应用程序。该应用程序使用多个JMS(Websphere MQ)队列中的消息,并将结果写入单个数据库 然而,我们有一个要求,即在应用程序中,给定ID的所有消息一次处理一条。我们目前使用同步集合强制执行此操作,但这在集群中不起作用 那么,有没有一种方法可以配置应用程序/集群/激活规范来实现这一点呢?首先要认识到的是,应用程序的设计必须消除消息亲缘关系,以便水平扩展。消息传递传输在克服应用程序的设计约束方面可以达到的程度是有限的。基于消息有效负载内容改变消息传递路由

我们正在开发一个将部署到WAS集群的应用程序。该应用程序使用多个JMS(Websphere MQ)队列中的消息,并将结果写入单个数据库

然而,我们有一个要求,即在应用程序中,给定ID的所有消息一次处理一条。我们目前使用同步集合强制执行此操作,但这在集群中不起作用


那么,有没有一种方法可以配置应用程序/集群/激活规范来实现这一点呢?

首先要认识到的是,应用程序的设计必须消除消息亲缘关系,以便水平扩展。消息传递传输在克服应用程序的设计约束方面可以达到的程度是有限的。基于消息有效负载内容改变消息传递路由、顺序或目的地的处理是ESB的一项工作,而不是传输。最佳解决方案是使用适合水平扩展的体系结构重新设计应用程序

也就是说,一种方法是使用消息组。寻找新组的应用程序实例应忽略
JMSXGroupID
不是
1
的任何消息。发送消息的应用程序必须准备好相应地设置组ID和序列号


实现这一点的另一种方法是拦截和调度。程序读取主队列以查找ID的新实例。当它看到新ID时,会将该消息移动到单独的调度队列。使用应用程序实例都读取调度队列以查找工作。由于此队列中的Id保证是唯一的,因此每个Id都分配给特定的应用程序实例。然后,应用程序使用待处理ID的选择器打开主队列。生产者应用程序必须将ID设置为消息属性或在“相关ID”字段中进行选择,但它们不需要管理组。

我可以告诉您和以前的响应者对此的了解比我多,但以防万一这会有所帮助

我们有一个MDB,希望在整个集群中一次只处理一个请求,因此我们在激活规范中将“最大并发端点”设置为1

因此,您可以为这个特定的ID使用不同的目的地,或者让初始目的地的逻辑将ID重新排队到第二个目的地