我使用默认的MessageListener连接到SQS队列。我想跟踪并重试具有异常的消息。所以我使用的是DUPS_OK_ACKNOWLEDGEMENT模式。在这种情况下,如果我正在确认一条消息,它将确认队列中的所有消息。
如何使每条消息确认无效,并重试有异常的消息?
public class MyListener implements MessageListener {
public void onMessage(Message message) {
try{
//my logic
message.acknowledge();
}catch(Exception e){
}
}}
答案 0 :(得分:0)
DUPS_OK_ACKNOWLEDGEMENT是一种延迟确认模式,它在自上次批次确认后经过一定时间间隔后批量确认消息。
如果要单独确认每条消息,则应使用CLIENT_ACKNOWLEDGEMENT模式。 具有Client_Acknowledge模式的Spring消息侦听器将在客户端调用message.acknowledge()时确认该消息。
但是,如果在成功执行消息后,消费者没有从客户端找到任何确认,则spring假定执行成功并确认消息。
如果在任何时候,消费者在处理消息时遇到异常,则Spring侦听器需要知道发生了一些异常,以便将消息重新发送到队列以供另一个消费者线程接收。如果您正在捕获异常,则spring假定所有内容都已处理并且执行顺利,因此会确认该消息。
Spring消息侦听器只允许从onMessage侦听器抛出JMS异常。捕获自定义异常并从侦听器抛出JMS异常(在记录错误以供将来参考之后)将允许您重新传递消息。