Java 模块集群与JMS

Java 模块集群与JMS,java,jms,cluster-computing,publish-subscribe,Java,Jms,Cluster Computing,Publish Subscribe,我有一个模块,它在JVM(无容器)中独立运行,并通过JMS与其他模块通信。 我的模块既是一个队列中的生产者,又是另一个队列中的消费者。 然后,出于HA和工作负载的原因,我需要对这个模块进行集群,我可能会使用Terracotta+Hibernate对我的实体进行集群。 当前,当我的应用程序启动时,它会启动一个线程(通过Executors.newSingleThreadExecutor()),作为使用者(如果相关和必要,我可以附加实际的代码示例) 我从这里的阅读问题中了解到,如果我只是在N不同的JV

我有一个模块,它在
JVM
(无容器)中独立运行,并通过
JMS
与其他模块通信。 我的模块既是一个队列中的生产者,又是另一个队列中的消费者。 然后,出于HA和工作负载的原因,我需要对这个模块进行集群,我可能会使用Terracotta+Hibernate对我的实体进行集群。 当前,当我的应用程序启动时,它会启动一个线程(通过
Executors.newSingleThreadExecutor()
),作为使用者(如果相关和必要,我可以附加实际的代码示例)

我从这里的阅读问题中了解到,如果我只是在
N
不同的
JVM
上启动我的模块,那么
N
将创建不同的订阅者,队列中的每条消息将到达
N
订阅者。 我想做的是只让其中一个(让我们现在说哪一个不重要)处理该消息,因此实际上使我能够一次处理
N
消息

如何做到这一点?我偏离轨道了吗

顺便说一句,我正在使用
OpenMQ
作为我的实现,但我不知道这是否相关


感谢您的帮助

这是群集环境中消息处理的经典案例。这就是我要做的


使用广播消息(基于频道)代替队列。队列对于点对点通信很有用,但效果不是很好。设置消息的有效性,直到其中一个使用者使用它为止。这样,其他消费者甚至看不到消息,只有一个消费者会使用它

看一看。您可以考虑实现您的模块/订阅服务器,以便使用j群组来实现所需的同步。JGroups提供可靠的多播通信。

你好,Tushar,谢谢你的帮助。什么是
广播消息
?它是在JMS队列上发送的另一种消息吗?另外,您所说的“队列对于点对点通信很有用,但效果不是很好”是什么意思?ThanksI的意思是使用基于主题的通信代替基于队列的通信,在这种通信中,您必须在传递消息时指定目的地,或者必须实现某种路由器逻辑,以便根据某些标准将消息路由到特定的消费者。Hi Tushar,我读了一些关于主题与队列的文章,你们的解决方案听起来很棒。我唯一不明白的是关于消息的“设置有效性…”我为什么需要设置其有效性?根据主题机制的定义,它不会被一个消费者消费吗?伊泰