AWS SQS JMS确认

时间:2018-02-19 15:35:55

标签: amazon-web-services queue jms amazon-sqs

我使用默认的MessageListener连接到SQS队列。我想跟踪并重试具有异常的消息。所以我使用的是DUPS_OK_ACKNOWLEDGEMENT模式。在这种情况下,如果我正在确认一条消息,它将确认队列中的所有消息。

如何使每条消息确认无效,并重试有异常的消息?

public class MyListener implements MessageListener {
    public void onMessage(Message message) {
    try{
        //my logic
        message.acknowledge();
    }catch(Exception e){
    }
}}

1 个答案:

答案 0 :(得分:0)

DUPS_OK_ACKNOWLEDGEMENT是一种延迟确认模式,它在自上次批次确认后经过一定时间间隔后批量确认消息。

如果要单独确认每条消息,则应使用CLIENT_ACKNOWLEDGEMENT模式。 具有Client_Acknowledge模式的Spring消息侦听器将在客户端调用message.acknowledge()时确认该消息。

但是,如果在成功执行消息后,消费者没有从客户端找到任何确认,则spring假定执行成功并确认消息。

如果在任何时候,消费者在处理消息时遇到异常,则Spring侦听器需要知道发生了一些异常,以便将消息重新发送到队列以供另一个消费者线程接收。如果您正在捕获异常,则spring假定所有内容都已处理并且执行顺利,因此会确认该消息。

Spring消息侦听器只允许从onMessage侦听器抛出JMS异常。捕获自定义异常并从侦听器抛出JMS异常(在记录错误以供将来参考之后)将允许您重新传递消息。