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

a9wyjsp7  于 2023-03-06  发布在  Java
关注(0)|答案(3)|浏览(198)

我有一个标准的SNS主题,我设置了“订阅过滤策略”,如下所示:

{
  "event": [
    "eventName"
  ]
}

当我使用属性消息通过AWS控制台发布消息时,消息会到达正确的SQS订阅者,因此订阅过滤器工作正常。
现在我正尝试在我的java代码上做同样的事情(Sping Boot )。
我使用的是lib spring-cloud-aws-messaging,据我所知,它只是AWS JDK的一个 Package 器。
问题是我不知道如何像在AWS控制台上那样设置消息属性。
不管我发送到SNS的JSON格式是什么,属性总是在SNS消息的正文中。我猜有一个特定的方法来设置这些属性。
我找到了com.amazonaws.services.sns.model.MessageAttributeValue
我不确定是否是正确的类,我也不明白如何发布消息和属性,因为方法publish不接受它。

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

xtfmy6hx1#

根据官方文档,有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);
vlf7wbxs

vlf7wbxs2#

如果你想使用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);
vu8f3i0k

vu8f3i0k3#

如果您不想使用基于属性的消息过滤,而切换到基于负载的消息过滤,您也可以。您只需将名为FilterPolicyScope的订阅属性设置为MessageBody,而默认值为MessageAttributes。更多信息:https://aws.amazon.com/blogs/compute/introducing-payload-based-message-filtering-for-amazon-sns/

相关问题