【问题标题】:JMS send same message back to SQSJMS 将相同的消息发送回 SQS
【发布时间】:2020-04-13 08:21:54
【问题描述】:

我正在研究一种方法,我需要将消息发送回 SQS。 我不希望它作为新消息出现,因为这将重置代码所需的 approximateRecieveCount 参数。

请注意 我无法将 NACK 发送到队列,因为我正在将其作为 10 条消息的批次读取,我想在某些情况下手动将其回发给单个消息,而不是作为批次。

我正在尝试使用的代码

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

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

  1. JMSMessageID
  2. 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;
        }
    });
}

我可以设置/使用什么来确保消息不被视为新消息并保持大致的接收计数吗?

【问题讨论】:

    标签: java amazon-sqs spring-jms


    【解决方案1】:

    是的。这是可以做到的。当您在设置消费者时将 JMS 用于 SQS 时,您可以在消费者会话中定义 UNORDERED_ACKNOWLEDGE 模式。通过这样做,如果您不确认特定消息,它将在其可见性超时到期后重新传递,并且approximateRecieveCount 将增加。这不会影响您在同一批次中的其他消息。这样做的一个缺点是,如果您使用的是 fifo 队列并且您的所有消息都具有相同的组 ID,那么您的下一条消息将仅在此 unacknowledged 消息最终进入死信队列后处理。这只会在您为您在 fifo 队列配置中设置的 Maximum Receives 重试消息后才会发生。注意:这里的关键是不要acknowledge 特定消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2018-07-30
      相关资源
      最近更新 更多