我的SQSListener返回正文作为messageID,并且如何通过QueueMessagingTemplate Spring Boot获取发送的MessageId?

问题描述 投票:0回答:1

我有两个关于Spring AWS-SQS sdk的问题,(或者我做错了。

首先是我之前使用过CLI,并且设法获得了已发送消息示例的消息ID:

aws sqs send-message --queue-url https://sqs.us-west-2.amazonaws.com/testqueue --message-body hooray   

'{
    "MD5OfMessageBody": "d3101ad", 
    "MessageId": "jdhj-933"
}

现在我尝试使用spring-cloud-starter-aws-messaging,并设置了这样的队列消息传递模板

private final QueueMessagingTemplate queueMessagingTemplate;

  public SqsQueueService(@Qualifier("amazonSQSAsync") final AmazonSQSAsync amazonSQS) {
    this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSQS);
  }

  public void sendMessage(String queueName, String queueMessage) {
    Map<String, Object> headers = new HashMap<>();
    queueMessagingTemplate.convertAndSend(queueName, queueMessage, headers);
  }

我似乎可以使用queueMessagingTemplate.convertAndSend(queueName, queueMessage, headers);获取已发送邮件的邮件ID

我需要messageId来满足一些业务逻辑。

第二个问题是我的侦听器可以接收消息,但是messageID也为null;

  @Async
  @SqsListener(value = "${notification.sqs-queue-url}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
  public void listen(Acknowledgment acknowledgment, String message, String messageId) {

    //messageId is equal to message here. which is wrong for me
  }

消息始终等于messageId,这很令人困惑,关于我可能会出错的任何建议?

spring-boot amazon-sqs spring-messaging spring-cloud-aws
1个回答
0
投票

我将列表方法的签名更改为

 @Async
  @SqsListener(value = "${queue-url}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
  public void listen(Acknowledgment acknowledgment, String message, @Headers MessageHeaders headers) throws ExecutionException, InterruptedException {
    String messageId = (String) headers.get("MessageId");
    acknowledgment.acknowledge().get();
  }

然后从标题映射中提取messageId

© www.soinside.com 2019 - 2024. All rights reserved.