Activemq主题与多个消费者

时间:2014-04-08 15:31:39

标签: spring apache-camel activemq jbossfuse blueprint-osgi

我现在很多时候都在研究这个问题,似乎无法找到任何最终解决方案。 我有一个消息制作人,应该作为一个广播公司,发布两个不同主题的消息。发布者的发布流程遵循以下流程:

  • 创建与工厂的连接并启动它。
  • 创建会话
  • 使用会话和给定主题名称
  • 创建Message Producer
  • 发送n *条消息
  • 等待n秒
  • 关闭制作人,会话,连接

然后我有3个消费者通过使用以下配置订阅这些主题(每个消费者拥有它自己的clientIddurableSubscriptionName):

<route id="consumerOneRoute">
    <from uri="activemq:topic:topicName?clientId=consumerOneId&durableSubscriptionName=ConsumerOneName" />
    <bean ref="consumerBean" method="processMessage" />
</route>

事实是,我的消费者并不总是收到消息,至少不是全部消息。有时两个消费者获得所有消息而第三个消费者得不到任何消息,有时随机消费者会收到随机数量的消息等等...... 我注意到的另一个事实是,如果我停止代理并再次启动它,消费者将收到丢失的消息,我真的不明白为什么不会在经纪人的第一个生命周期中发生这种情况。 有人会这么善良并试图帮助我吗?

谢谢, 乔治。

PS:我正在考虑使用虚拟主题,因为我的主要目的是让一个广播制作人允许其他消费者在将来附加我不希望每次都通过添加来修改制作人主题的另一个虚拟分支。

4 个答案:

答案 0 :(得分:1)

我有类似的问题,1个生产者通过主题向许多消费者发送消息,而不是所有消费者都收到消息。问题在于消费者的超时,我手动创建了超时,并且它比ActiveMQ可以提供最后的消息更短。延长超时 - 帮助。

答案 1 :(得分:0)

看看Prefetch Policy。如果您将其设置为1,那么它可能会为您修复此问题。

...&consumer.prefetchSize=1

答案 2 :(得分:0)

唯一有效的解决方案是从具有持久消费者的主题切换到虚拟主题。

答案 3 :(得分:0)

当生产者发送消息时,您的消费者必须连接到经纪人。