许多队列的一个消费者

时间:2014-12-11 23:37:26

标签: java jms activemq

在我的系统中,有很多用户撰写博客。我需要订阅不同的用户。没有集中式系统(它是一个摇摆应用程序)。

我正在使用JMS。

用户可以关注一个用户,两个用户或100个用户。

m_destination1 = m_session.createQueue("USER.DEVID");
m_consumer1 = m_session.createConsumer(m_destination1);

m_destination2 = m_session.createQueue("USER.HARRY");
m_consumer2 = m_session.createConsumer(m_destination2);

是否有任何通用方法可以为未知的no编写上述代码行。用户?就像一个消费者可以接收来自许多用户的消息一样。

这里的通配符不起作用。

2 个答案:

答案 0 :(得分:1)

你可以使用的最好的东西是activeMQ的Mirrored Queue功能, 你可以在这里阅读文档

镜像队列基本上做的是,它将队列上发送的所有消息转发到类似的命名主题,然后可以由多个消费者订阅该主题。

如果您使用镜像队列,则需要您的消费者订阅不同的主题。

您的设计需要发布 - 订阅(主题)域而不是点对点架构(即队列)。因为您已经拥有一个为不同的人编写博客生成队列的架构,请更改为系统不是必需的,但您的要求将得到满足。

除此之外,如果2个消费者在队列中收听,那么他们将从队列中并行地接收消息,即如果队列中有2个消息,则两个消费者将独立处理1个消息,我不认为&# 39; s你想要什么。

希望这有帮助! 祝你好运!

答案 1 :(得分:1)

@ Vihar的回答是正确的,您应该通过使用主题来使用发布 - 订阅范例,以允许多个消费者同时收到新博客帖子的通知。听起来你的主要痛点是每个作者有一个目的地,想要消费消息的用户必须单独订阅每个目的地。

相反,将所有新帖子消息发布到一个主题中(让我们称之为NewPostNotificationTopic)。然后,客户可以订阅所有消息,但会立即根据他们关心的作者列表进行检查,并立即停止处理他们未关注的作者的任何通知。 (这会将过滤放入消息处理程序而不是ActiveMQ网络。)这意味着每条消息都将传递给每个客户端,但只要消息很小并且您的网络速度很快且您的用户通常连接到在网络上,这可能是一个可行的解决方案。但是,如果您无法承担向所有客户端发送所有邮件的网络带宽,或者您的消费者将长时间处于脱机状态而您无法持有所有消息的副本直到他们回到网上,这可能不适合你。

或者,将所有消息发布到同一主题中,但将作者的ID设置为消息上的标题,并使用消息选择器告诉ActiveMQ仅传递与给定作者ID匹配的消息。这样会更有效,但是您需要明确告诉ActiveMQ您关心哪些作者,或者使用包含OR的选择器进行单个订阅,或者为每个作者使用一个订阅。后者更干净,但让你回到每个读者每个作者一个订阅的问题;前者仅产生一个订阅,但每次为读者添加/删除作者时都必须更新,并且您需要确保处理删除订阅和添加另一个订阅时固有的竞争条件。如果我提出的性能问题没有问题,我会选择我提出的第一个解决方案(在消息处理程序中而不是在ActiveMQ订阅中进行过滤)。否则我可能会为每个读者每个作者订阅一个订阅,而不是使用ORed选择器进行单个订阅,并且每次更改时都需要重新订阅。