Java JMS将相同的消息发送回SQS

Java JMS将相同的消息发送回SQS,java,amazon-sqs,spring-jms,Java,Amazon Sqs,Spring Jms,我正在研究一种方法,要求我向SQS发送一条消息。 我不希望它成为新消息,因为这将重置代码所需的近似ReceiveCount参数。 请注意 我无法向队列发送NACK,因为我正在以一批10条消息的形式读取NACK,在某些情况下,我希望手动将其发回单个消息,而不是以一批消息的形式。 我正在尝试使用的代码 我尝试设置JMSMessageId,但根据文档,这是不可能的- 发送消息后,Amazon SQS为每条消息设置以下标题和属性: JMSMessageID JMS_SQS_SequenceNumber

我正在研究一种方法,要求我向SQS发送一条消息。 我不希望它成为新消息,因为这将重置代码所需的近似ReceiveCount参数。

请注意 我无法向队列发送NACK,因为我正在以一批10条消息的形式读取NACK,在某些情况下,我希望手动将其发回单个消息,而不是以一批消息的形式。

我正在尝试使用的代码

我尝试设置JMSMessageId,但根据文档,这是不可能的-

发送消息后,Amazon SQS为每条消息设置以下标题和属性:

  • JMSMessageID
  • JMS_SQS_SequenceNumber(仅适用于FIFO队列)
  • 我现在使用的代码是

        defaultJmsTemplate.send(destinationName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                Message message = session.createTextMessage(errorMessage);
                message.setJMSCorrelationID(transactionId);
    
                if (destinationName.endsWith(".fifo")) {
                    message.setStringProperty("JMSXGroupID", property.getMessageGroup());
                    message.setStringProperty("JMS_SQS_DeduplicationId", java.util.UUID.randomUUID().toString());
                }
    
                return message;
            }
        });
    }
    

    是否有什么可以设置/使用的方法来确保该消息不被视为新消息,并且保持大致的接收计数?

    是。这是可以做到的。当您在设置消费者时使用JMS for SQS时,您可以在消费者会话中定义
    无序确认
    模式。这样做,如果您不确认某个特定消息,则该消息将在其可见性超时过期后重新发送,并且
    近似ReceiveCount
    将增加。这不会影响同一批中的其他邮件。这样做的一个缺点是,如果您使用的是fifo队列,并且您的所有消息都具有相同的组id,那么只有在未确认的
    消息在死信队列中结束后,才会处理下一条消息。只有在对您在fifo队列配置中设置的
    最大接收次数
    重试消息后,才会发生这种情况。注意:这里的关键是不要确认某一特定消息。

    是。这是可以做到的。当您在设置消费者时使用JMS for SQS时,您可以在消费者会话中定义
    无序确认
    模式。这样做,如果您不确认某个特定消息,则该消息将在其可见性超时过期后重新发送,并且
    近似ReceiveCount
    将增加。这不会影响同一批中的其他邮件。这样做的一个缺点是,如果您使用的是fifo队列,并且您的所有消息都具有相同的组id,那么只有在未确认的
    消息在死信队列中结束后,才会处理下一条消息。只有在对您在fifo队列配置中设置的
    最大接收次数
    重试消息后,才会发生这种情况。注意:这里的关键是不要
    确认
    特定消息