JMS AUTO_ACKNOWLEDGE是什么时候被确认的?

32

我已经尝试在谷歌上搜索此问题,但没有成功。如果我正在使用AUTO_ACKNOWLEDGE,并且我有一个用Java编写的消费者客户端,那么消息是何时被确认的呢?我正在使用一个包含onMessage方法的MessageListener。确认消息是在onMessage方法之前还是之后发送回服务器,或者在其他某个时间点发送回服务器?感谢您提供的任何帮助!

2个回答

35
请查看此文章 (由于2020年文章已下线,这是 Wayback Machine 的链接)

使用AUTO_ACKNOWLEDGE模式时,在onMessage()处理程序返回后隐式发生确认(acknowledgment)操作。接收消息的客户端可以通过在消费会话上指定CLIENT_ACKNOWLEDGE模式来更精细地控制保证消息的传递。

使用CLIENT_ACKNOWLEDGE允许应用程序控制确认发送的时间。例如,应用程序可以确认一条消息(从而使 JMS 提供者免除责任),并执行表示该消息所代表的数据的进一步处理。关键在于 Message 对象上的 acknowledge() 方法,如清单1所示。

acknowledge()方法通知 JMS 提供者消费者已成功接收到消息。如果在确认过程中发生提供者故障,则此方法向客户端抛出异常。提供者故障导致消息被 JMS 服务器保留以进行重新传递。


9
如果在处理onMessage()期间抛出异常,会发生什么?如果设置了AUTO_ACKNOWLEDGE,那么消息是否会被重新传递? - Geek
2
@Geek - 如果在onReceive或JMSListener中抛出异常,则不会发送确认并将重新传递。 - GameSalutes
2
如果使用 AUTO_ACKNOWLEDGE 同步接收消息,则在调用 consumer.receive 方法时确认已收到消息。 - Wecherowski
@GameSalutes - 你能详细描述一下消息是如何重新传递的,由谁再次传递消息以及何时进行重新传递吗? - Simple-Solution

15

客户确认模式
使用这种确认模式,客户端通过调用消息的确认方法来确认已消费的消息。

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
...
msg = (TextMessage) consumer.receive();
//acknowledge
msg.acknowledge();

AUTO_ACKNOWLEDGE
使用此确认模式时,会话会在成功从调用 receive 返回或会话调用的消息监听器成功返回后,自动确认客户端已接收到消息。

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

源代码
最佳实例


非常具体和有帮助。谢谢! - ishallwin
1
当消息监听器调用会话以成功处理消息时返回时,这听起来很奇怪。 - wakedeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接