JMS,仅使用一次来自主题的消息

JMS, consume a message from a topic only once

我需要在我的应用程序中与发布者和消费者建立点对点通信。我给出的是一个主题。所以我应该确保主题中的消息只会被消费一次,并且只有一个实例应该消费它。 (消费者有多个实例。)

我了解消息队列是满足上述需求的解决方案。但我将不得不处理给定的主题。

我尝试了一个示例应用程序,我所有的消费者实例都使用了主题中的消息。我计划使用 table 来跟踪消息处理,但这似乎不是一个好的解决方案。我们使用带有 spring 引导 JMS 的 IBM MQ。这可行吗?

JMS 主题,一般来说,提供 publish-subscribe 语义,其中每个 consumer/subscriber 获取发送到主题的每条消息。但是,有一种方法可以在 JMS 主题上获得多个消费者的 point-to-point 语义 - 共享订阅。

共享订阅从 JMS 2 开始可用。使用此功能时,多个 consumers/subscribers 可以共享 相同的 订阅,并且只有其中一个消费者会收到给定的消息。

创建共享订阅的最简单方法是使用 javax.jms.Session.createSharedConsumer()。这将创建一个共享的 non-durable 订阅,与创建持久订阅设置不同的是,连接上的客户端 ID 是 可选 。还有其他相关方法可用于创建共享的持久订阅、使用选择器等。

简而言之,只要所有消费者都使用相同的订阅名称创建共享订阅,那么您可以获得所需的 point-to-point 语义。