我正在处理一个独立的MQ JMS应用程序,我们的应用程序需要“知道”客户端已经使用消息生产者放入队列。因为客户端应用程序不是我们的责任。所以我们不能让他们写“msg.acknowledge();”在他们身边的事情(msg.acknowledge()不是我的条件下的正确方法)。我在stackoverflow中搜索历史答案。查找以下是完全一样的东西我想:发件人如何知道已使用MQ JMS API的消息?
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中的存档吗?我只需要在msg生成端进行编码,它可以是队列或主题。
另一个问题是在JMS中的确认模式CLIENT_ACKNOWLEDGE,是不是产生了不相关的?我始终认为,这种模式可以在调用send()方法时阻止应用程序,直到客户端使用消息并调用msg.acknowledge(),但似乎不是这样。产品在消息传递后才退出应用程序,消息只是存储在队列中,直到客户端调用acknowledge()。这有可能让生产者的应用程序等待,直到消息被客户确认为止。
如果我的观念不对,请纠正我,谢谢。
感谢Shashi,您的回复非常有用。我们需要知道消费者获得消息并记录我们的时间戳。所以我们需要知道消费者已经收到消息。如何使用主题来归档呢?那是不一样的吗?我知道主题可以同步传递消息。如果我使用持久订阅,那可以满足我的要求吗? – phyerbarte 2012-01-06 06:43:42
顺便说一句,正如你所提到的,我们可以从队列中检查消息ID,以确定消息是否已被客户端使用,是所谓的JMS浏览?我对JMS技术细节并不熟悉,只想确认一个方向,然后我可以研究它。再次感谢。 – phyerbarte 2012-01-06 06:47:03
@Shashi,在MQ(IBM)的情况下,客户端是否必须发送确认消息已经读取?如果没有,那么自动确认段的确切时间是否发送回q管理器?它是在onMessage被调用之后? – bluelurker 2016-02-01 14:43:02