我已经尝试在谷歌上搜索此问题,但没有成功。如果我正在使用AUTO_ACKNOWLEDGE
,并且我有一个用Java编写的消费者客户端,那么消息是何时被确认的呢?我正在使用一个包含onMessage
方法的MessageListener
。确认消息是在onMessage
方法之前还是之后发送回服务器,或者在其他某个时间点发送回服务器?感谢您提供的任何帮助!
使用AUTO_ACKNOWLEDGE
模式时,在onMessage()
处理程序返回后隐式发生确认(acknowledgment)操作。接收消息的客户端可以通过在消费会话上指定CLIENT_ACKNOWLEDGE
模式来更精细地控制保证消息的传递。
使用CLIENT_ACKNOWLEDGE
允许应用程序控制确认发送的时间。例如,应用程序可以确认一条消息(从而使 JMS 提供者免除责任),并执行表示该消息所代表的数据的进一步处理。关键在于 Message 对象上的 acknowledge() 方法,如清单1所示。
acknowledge()
方法通知 JMS 提供者消费者已成功接收到消息。如果在确认过程中发生提供者故障,则此方法向客户端抛出异常。提供者故障导致消息被 JMS 服务器保留以进行重新传递。
客户确认模式
使用这种确认模式,客户端通过调用消息的确认方法来确认已消费的消息。
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);
onMessage()
期间抛出异常,会发生什么?如果设置了AUTO_ACKNOWLEDGE
,那么消息是否会被重新传递? - Geek