2

我现在已经在这个问题上工作了很多时间,但似乎找不到任何最终解决方案。我有一个消息制作者,应该作为广播员,发布关于两个不同主题的消息。发布者的发布过程遵循以下流程:

  • 创建与工厂的连接并启动它。
  • 创建会话
  • 使用会话和给定主题名称创建消息生产者
  • 发送 n* 条消息
  • 等待 n 秒
  • 关闭生产者、会话、连接

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

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

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

谢谢,乔治。

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

4

4 回答 4

1

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

于 2017-11-19T16:13:00.213 回答
0

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

...&consumer.prefetchSize=1
于 2014-04-11T11:08:51.877 回答
0

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

于 2014-06-12T10:57:22.047 回答
0

当生产者发送消息时,您的消费者必须连接到代理。

于 2017-11-26T12:09:55.443 回答