我怎样才能实现对主题的消息处理一次?

Posted

技术标签:

【中文标题】我怎样才能实现对主题的消息处理一次?【英文标题】:How can i achieve processing of a mesaage to a topic only once? 【发布时间】:2019-03-21 01:41:05 【问题描述】:

我有两个订阅主题的应用实例。由于有两个实例(即两个订阅者),因此将生成两个事件(消息)并将其写入队列。 (现在我在队列中有重复的消息,并且每个消息都将被处理)但是我想要一个解决方案,其中只处理一个事件/或只将一条消息写入队列。我怎样才能做到这一点?我必须有两个订阅者,而不是一个失败

【问题讨论】:

您使用的是 IBM MQ 还是其他一些 JMS 提供程序? 【参考方案1】:

JMS 主题遵循发布-订阅语义,每个订阅者都会收到消息。但是,JMS 队列遵循点对点语义,其中只有 1 个连接的消费者将接收消息。因此,如果您希望消息仅由一个客户端使用,那么您的所有消费者都应该连接到 JMS queue 而不是 topic

【讨论】:

嗨贾斯汀感谢您的回复。但是我必须有两个订阅者,以防万一出现故障。由于有两个订阅者,队列上会有两条消息,并且都将被处理。我怎样才能避免同时处理这两条消息? @coder,队列中会有一条消息。所以第一个订阅者收到消息并尝试处理它。如果处理成功完成,则订阅者确认消息已处理并且消息从队列中删除。如果处理失败(由于订阅者关闭或其他原因),则消息不会被确认,并且可以由第二个订阅者处理 如果我有两个订阅者,将生成两个正确的通知,并将两条消息写入队列 订阅者只接收消息。他们不发送。订阅者的数量对代理从生产者实际接收到的消息数量没有影响。我不清楚这里到底是什么问题。 签出***.com/questions/5576415/jms-topic-vs-queues

以上是关于我怎样才能实现对主题的消息处理一次?的主要内容,如果未能解决你的问题,请参考以下文章

Floodlight中 处理packetin消息的顺序

卡夫卡消费者:受控阅读主题

kafka | 幂等生产者和事务生产者是一回事吗?

如何拒绝消息

从 mule 中的队列/主题中读取消息

多处理 IOError:错误消息长度