3

我正在处理一个独立的 MQ JMS 应用程序,我们的应用程序需要“意识到”客户端已经使用了放在队列中的消息生产者。因为客户端应用程序不由我们负责。所以我们不能让他们写像“msg.acknowledge();”这样的东西 他们这边的事情(msg.acknowledge() 在我的情况下不是正确的方法。)。我在stackoverflow中搜索历史答案。发现以下与我想要的完全一样:

https://stackoverflow.com/questions/6521117/how-to-guarantee-delivery-of-the-message-in-jms

JMS 规范或各种实现是否支持消息的传递确认?

我的问题是,还有其他方法可以在 MQ API 或 JMS API 中存档吗?我只需要在味精生产端进行编码,它可以是队列或主题。

另一个问题是 JMS 中的确认模式 CLIENT_ACKNOWLEDGE,是否产生无关紧要?我一直相信这种模式可以在调用 send() 方法时阻塞应用程序,直到客户端消费消息并调用 msg.acknowledge(),但似乎不是这样。产品在消息传递后退出应用程序,消息仅存储在队列中,直到客户端调用确认()。是否可以让生产者应用程序挂在那里等到客户端确认消息?

如果我的概念不正确,请纠正我,谢谢。

4

1 回答 1

8

消息队列的主要目的是解耦生产者和消费者。生产者不需要等待消息被消费者消费,它可以继续它的工作。理想情况下,如果生产者需要知道消息是否已被消费者处理,它应该等待消费者在另一个队列上发送响应消息。

消息确认与生产者无关。消息确认是消费者告诉消息传递提供者在消息传递到应用程序后从队列中删除消息的方式。

JMS 提供者(如 MQ JMS)在将消息传递到应用程序后,会在哪里自动确认,告诉消息传递提供者从队列中删除消息。然后是客户端确认,在收到消息后,应用程序明确告诉消息传递提供者从队列中删除消息。

生产者必须等待消费者接收消息是否有原因?一种方法虽然不优雅,但可能是:发送消息后,使用已发送消息的消息 ID 并尝试浏览该消息。如果没有找到消息,你可以假设它已经被消费了

于 2012-01-06T04:28:24.337 回答