【发布时间】:2012-07-25 06:42:29
【问题描述】:
我试过用谷歌搜索,但没有成功。如果我使用AUTO_ACKNOWLEDGE,并且我有一个用Java 编写的消费者客户端,那么消息何时被确认?我正在使用包含 onMessage 方法的 MessageListener。确认是在onMessage 之前或onMessage 完成之后还是在其他时间发送回服务器?提前感谢任何人能够提供的任何帮助!
【问题讨论】:
我试过用谷歌搜索,但没有成功。如果我使用AUTO_ACKNOWLEDGE,并且我有一个用Java 编写的消费者客户端,那么消息何时被确认?我正在使用包含 onMessage 方法的 MessageListener。确认是在onMessage 之前或onMessage 完成之后还是在其他时间发送回服务器?提前感谢任何人能够提供的任何帮助!
【问题讨论】:
请查看此one(用作文章的 Wayback Machine 链接自 2020 年起下线)
在AUTO_ACKNOWLEDGE 模式下,确认总是在onMessage() 处理程序返回后隐式发生的最后一件事。接收消息的客户端可以通过在消费会话上指定CLIENT_ACKNOWLEDGE 模式来更细粒度地控制有保证的消息的传递。
CLIENT_ACKNOWLEDGE 的使用允许应用程序控制何时发送确认。例如,应用程序可以确认消息 - 从而减轻 JMS 提供者的职责 - 并对由消息表示的数据执行进一步处理。关键是 Message 对象上的 acknowledge() 方法,如清单 1 所示。
acknowledge() 方法通知 JMS 提供者消息已被消费者成功接收。如果在确认过程中发生提供程序故障,此方法将向客户端抛出异常。提供程序失败会导致 JMS 服务器保留消息以进行重新传递。
【讨论】:
onMessage()处理过程中抛出异常怎么办?如果设置了AUTO_ACKNOWLEDGE,消息会重新传递吗?
CLIENT_ACKNOWLEDGE
使用这种确认模式,客户端通过调用消息的确认方法来确认已消费的消息。
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
...
msg = (TextMessage) consumer.receive();
//acknowledge
msg.acknowledge();
AUTO_ACKNOWLEDGE
使用这种确认模式,当会话从接收调用成功返回或会话调用以处理消息的消息侦听器成功返回时,会话自动确认客户端收到消息。
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
【讨论】: