2010-08-17 87 views
2

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

我从这里阅读理解的问题是什么,如果我刚开始我的模块上N不同JVMs然后N不同的用户将被创建队列中的每个消息将到达N用户。 我想要做的是只有其中一个(让我们现在说哪一个不重要)处理该消息,因此实际上使我能够一次处理N消息。

该怎么做/应该这样做?我离开赛道吗?

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

感谢您的任何帮助

回答

1

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

使用广播消息(基于通道)代替队列。队列对于点对点通信是非常有用的。设置消息的有效性,直到其消费者消费的时间。这样,其他消费者甚至不会看到消息,只有一个消费者会消费它。

+0

嗨Tushar,谢谢你的帮助。 什么是广播消息?它是在JMS队列上发送的不同类型的消息吗?另外你的意思是:“队列对点对点通信有用”不是很有效“? 谢谢 – Ittai 2010-08-17 10:41:05

+0

我的意思是使用基于主题的通信来代替基于队列的通信,您必须在传递消息时指定目的地,或者必须实现某种路由器逻辑,以根据某些特定消费者将消息路由给特定的消费者标准。 – 2010-08-17 10:54:16

+0

Hi Tushar,我读了一些关于Topic vs. Queue的内容,你的解决方案听起来很棒。 我不明白的唯一事情就是关于“设置消息的有效性......”为什么我需要设置其有效性?主题机制的定义是不是会被一个消费者消费? Ittai – Ittai 2010-08-18 11:08:42

0

看看JGroups。您可以考虑实施您的模块/订户以使用jgroups来进行所需的同步。 JGroups提供可靠的多播通信。