2012-01-06 109 views
2

我正在处理一个独立的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()。这有可能让生产者的应用程序等待,直到消息被客户确认为止。

如果我的观念不对,请纠正我,谢谢。

回答

6

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

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

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

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

+0

感谢Shashi,您的回复非常有用。我们需要知道消费者获得消息并记录我们的时间戳。所以我们需要知道消费者已经收到消息。如何使用主题来归档呢?那是不一样的吗?我知道主题可以同步传递消息。如果我使用持久订阅,那可以满足我的要求吗? – phyerbarte 2012-01-06 06:43:42

+0

顺便说一句,正如你所提到的,我们可以从队列中检查消息ID,以确定消息是否已被客户端使用,是所谓的JMS浏览?我对JMS技术细节并不熟悉,只想确认一个方向,然后我可以研究它。再次感谢。 – phyerbarte 2012-01-06 06:47:03

+0

@Shashi,在MQ(IBM)的情况下,客户端是否必须发送确认消息已经读取?如果没有,那么自动确认段的确切时间是否发送回q管理器?它是在onMessage被调用之后? – bluelurker 2016-02-01 14:43:02