jms - 发送方如何知道消息已被 MQ JMS API 使用?

标签 jms mq

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

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

Do the JMS spec or the various implementations support delivery confirmation of messages?

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

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

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

最佳答案

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

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

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

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

关于jms - 发送方如何知道消息已被 MQ JMS API 使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8753158/

相关文章:

java - 多个 QueueConnectionFactory 上的异常

java - MQConstants.USE_MQCSP_AUTHENTICATION_PROPERTY 和 JMSConstants.USER_AUTHENTICATION_MQCSP 的字符串属性名称是什么?

java - JMS MQ绑定(bind)问题

java - Java中如何查找远程MQ队列的本地传输队列?

linux - POSIX 消息队列的替代方案

java - MQ 发布/订阅特定于域的接口(interface)通常比点对点更快吗?

java - WebSphere MQ Java 类中的 MQSecurityExit 是什么?

java - 如何判断数据库是否已关闭或不可用?

java - 我们可以使用非 Java 来使用 JMS 消息吗

linux - 在 MQ (Linux) 的队列中转储消息