JMS AUTO_ACKNOWLEDGE什么时候被确认?

Rei*_*Mac 23 java messaging jms

我试图谷歌这个,但没有成功.如果我正在使用AUTO_ACKNOWLEDGE,并且我有一个用Java编写的消费者客户端,那么消息何时被确认?我使用的MessageListener是包含onMessage方法的.确认是onMessageonMessage完成之前或之后还是在某个其他时间点发送回服务器的?提前感谢任何人都能提供的帮助!

And*_*sov 27

请检查这一个.

使用AUTO_ACKNOWLEDGE模式,确认始终是onMessage()处理程序返回后隐式发生的最后一件事.通过CLIENT_ACKNOWLEDGE在消费会话上指定模式,接收消息的客户端可以对保证消息的传送进行更细粒度的控制.

使用CLIENT_ACKNOWLEDGE允许应用程序控制何时发送确认.例如,应用程序可以确认消息 - 从而减轻JMS提供者的职责 - 并执行对消息所代表的数据的进一步处理.关键是Message对象上的acknowledge()方法,如清单1所示.

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

  • 如果在处理`onMessage()`期间抛出异常会发生什么?如果设置了'AUTO_ACKNOWLEDGE`,是否会重新传递消息? (6认同)
  • @Geek - 如果在onReceive或JMSListener中抛出异常,则不会发送确认并将重新传递 (2认同)
  • 如果使用 AUTO_ACKNOWLEDGE 同步接收消息,则在调用consumer.receive方法时会确认消息 (2认同)

Pre*_*raj 7

CLIENT_ACKNOWLEDGE
使用此确认模式,客户端通过调用消息的确认方法来确认消耗的消息.

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
...
msg = (TextMessage) consumer.receive();
//acknowledge
msg.acknowledge();
Run Code Online (Sandbox Code Playgroud)

AUTO_ACKNOWLEDGE
使用此确认模式,会话自动确认客户端收到消息时,或者当会话已成功从接收调用返回时,或者会话已调用的消息侦听器处理消息成功返回时.

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Run Code Online (Sandbox Code Playgroud)

来源
最好的例子