如何使用 spring-cloud-aws-messaging 或 aws-java-sdk 设置 AWS SNS 消息属性值?

How do I set AWS SNS message attribute values with spring-cloud-aws-messaging or aws-java-sdk?

我有一个标准的 SNS 主题,我设置了这样的“订阅过滤策略”:

{
  "event": [
    "eventName"
  ]
}

当我使用属性消息通过 AWS 控制台发布消息时,消息会发送到正确的 SQS 订阅者。所以订阅过滤器工作得很好。

现在我正尝试对我的 java 代码(Spring 引导)执行相同的操作。

我正在使用库 spring-cloud-aws-messaging,据我所知它只是 AWS JDK.

的包装器

问题是我不知道如何像在 AWS 控制台上那样设置消息属性。

我发送到 SNS 的 JSON 格式无关紧要,属性始终位于 SNS 消息的正文中。我想有一个特定的方法来设置这些属性。

我找到了com.amazonaws.services.sns.model.MessageAttributeValue

我不确定是否正确class,我也无法理解如何发布消息和属性,因为方法 publish 不接受它。

this.amazonSNS.publish(this.snsTopicARN, message, messageAttributes ???);

根据官方文档,有MessageAttributeValue.Builder,符合你的需要

https://javadoc.io/static/software.amazon.awssdk/sns/2.10.37/software/amazon/awssdk/services/sns/model/MessageAttributeValue.Builder.html

Map<String, MessageAttributeValue> attributes = new HashMap<>();

attributes.put("event", MessageAttributeValue.builder()
        .dataType("String")
        .stringValue("eventName")
        .build());

PublishRequest request = PublishRequest.builder()
        .topicArn("yourTopic")
        .message("YourMessageBody")
        .messageAttributes(attributes)
        .build();

yourDefinedSnsClient.publish(request);

如果你想使用 spring-cloud-aws 你可以这样做:

SnsMessage snsMessage = SnsMessage.builder()
    .message("test")
    .build();

Map<String, Object> headers = new HashMap<>();
headers.put("event", "eventName");

this.notificationMessagingTemplate.convertAndSend(topicName, snsMessage, headers);