Amazon Simple Notification Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

教程:将带有属性的消息发布到 Amazon SNS 主题

创建主题将终端节点订阅到此主题后,您可以将带有消息属性的消息发布到主题,这样,您就可以提供有关消息的结构元数据项。有关更多信息,请参阅 Amazon SNS 消息属性

以下教程说明如何使用 AWS 管理控制台、AWS SDK for Java和适用于 .NET 的 AWS 开发工具包将消息发布到主题。

使用 AWS 管理控制台将带有属性的消息发布到 Amazon SNS 主题

有关使用 AWS 管理控制台将带有属性的消息发布到 Amazon SNS 主题的详细说明,请参阅使用 AWS 管理控制台将消息发布到 Amazon SNS 主题

使用 AWS SDK for Java 将带有属性的消息发布到 Amazon SNS 主题

  1. 指定您的 AWS 凭证。有关更多信息,请参阅 适用于 Java 的 AWS 开发工具包 2.x 开发人员指南 中的设置用于开发的 AWS 凭证和区域

  2. 编写您的代码。有关更多信息,请参阅使用 适用于 Java 的开发工具包 2.x

    以下代码示例有助于简化发布带有属性的消息的过程。SNSMessageAttributes 类存储 messageAttributes 字段作为映射。您可以使用重载的 addAttribute 方法以添加数据类型为 StringString.ArrayNumber 的属性。要发布消息,请通过提供 AmazonSNS 客户端和主题 ARN 来使用 publish 方法。

    import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.model.MessageAttributeValue; import com.amazonaws.services.sns.model.PublishRequest; import com.amazonaws.services.sns.model.PublishResult; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class SNSMessageAttributes { private String message; private Map<String, MessageAttributeValue> messageAttributes; public SNSMessageAttributes(final String message) { this.message = message; messageAttributes = new HashMap<>(); } public String getMessage() { return message; } public void setMessage(final String message) { this.message = message; } public void addAttribute(final String attributeName, final String attributeValue) { final MessageAttributeValue messageAttributeValue = new MessageAttributeValue() .withDataType("String") .withStringValue(attributeValue); messageAttributes.put(attributeName, messageAttributeValue); } public void addAttribute(final String attributeName, final ArrayList<?> attributeValues) { String valuesString, delimiter = ", ", prefix = "[", suffix = "]"; if (attributeValues.get(0).getClass() == String.class) { delimiter = "\", \""; prefix = "[\""; suffix = "\"]"; } valuesString = attributeValues .stream() .map(Object::toString) .collect(Collectors.joining(delimiter, prefix, suffix)); final MessageAttributeValue messageAttributeValue = new MessageAttributeValue() .withDataType("String.Array") .withStringValue(valuesString); messageAttributes.put(attributeName, messageAttributeValue); } public void addAttribute(final String attributeName, final Number attributeValue) { final MessageAttributeValue messageAttributeValue = new MessageAttributeValue() .withDataType("Number") .withStringValue(attributeValue.toString()); messageAttributes.put(attributeName, messageAttributeValue); } public String publish(final AmazonSNS snsClient, final String topicArn) { final PublishRequest request = new PublishRequest(topicArn, message) .withMessageAttributes(messageAttributes); final PublishResult result = snsClient.publish(request); return result.getMessageId(); } }

    以下代码摘录初始化并使用示例 SNSMessageAttributes 类。

    // Initialize the example class. final SNSMessageAttributes message = new SNSMessageAttributes(messageBody); // Add message attributes with string values. message.addAttribute("store", "example_corp"); message.addAttribute("event", "order_placed"); // Add a message attribute with a list of string values. final ArrayList<String> interestsValues = new ArrayList<String>(); interestsValues.add("soccer"); interestsValues.add("rugby"); interestsValues.add("hockey"); message.addAttribute("customer_interests", interestsValues); // Add a message attribute with a numeric value. message.addAttribute("price_usd", 1000); // Add a Boolean attribute for filtering using subscription filter policies. // The class applies the String.Array data type to this attribute, allowing it // to be evaluated by a filter policy. final ArrayList<Boolean> encryptedVal = new ArrayList<Boolean>(); encryptedVal.add(false); message.addAttribute("encrypted", encryptedVal); // Publish the message. message.publish(snsClient, topicArn); // Print the MessageId of the message. System.out.println("MessageId: " + publishResponse.getMessageId());
  3. 编译并运行您的代码。

    消息已发布并且已打印 MessageId,例如:

    MessageId: 1234a567-bc89-012d-3e45-6fg7h890123i

使用 适用于 .NET 的 AWS 开发工具包 将带有属性的消息发布到 Amazon SNS 主题

  1. 指定您的 AWS 凭证。有关更多信息,请参阅 适用于 .NET 的 AWS 开发工具包 开发人员指南 中的配置 AWS 凭证

  2. 编写您的代码。有关更多信息,请参阅使用 适用于 .NET 的 AWS 开发工具包 进行编程

  3. 以下代码示例有助于简化发布带有属性的消息的过程。SNSMessageAttributes 类存储 MessageAttributes 字段作为词典。您可以使用重载的 addAttribute 方法以添加数据类型为 StringString.ArrayNumber 的属性。要发布消息,请通过提供 AmazonSimpleNotificationServiceClient 客户端和主题 ARN 来使用 publish 方法。

    using System; using System.Collections.Generic; using Amazon.SimpleNotificationService; using Amazon.SimpleNotificationService.Model; namespace SNSCreatePlatformEndpoint { class SNSMessageAttributes { private String message; private Dictionary<String, MessageAttributeValue> messageAttributes; public SNSMessageAttributes(String message) { this.message = message; messageAttributes = new Dictionary<string, MessageAttributeValue>(); } public string Message { get => this.message; set => this.message = value; } public void AddAttribute(String attributeName, String attributeValue) { messageAttributes[attributeName] = new MessageAttributeValue { DataType = "String", StringValue = attributeValue }; } public void AddAttribute(String attributeName, float attributeValue) { messageAttributes[attributeName] = new MessageAttributeValue { DataType = "Number", StringValue = attributeValue.ToString() }; } public void AddAttribute(String attributeName, int attributeValue) { messageAttributes[attributeName] = new MessageAttributeValue { DataType = "Number", StringValue = attributeValue.ToString() }; } public void AddAttribute(String attributeName, List<String> attributeValue) { String valueString = "[\"" + String.Join("\", \"", attributeValue.ToArray()) + "\"]"; messageAttributes[attributeName] = new MessageAttributeValue { DataType = "String.Array", StringValue = valueString }; } public void AddAttribute(String attributeName, List<float> attributeValue) { String valueString = "[" + String.Join(", ", attributeValue.ToArray()) + "]"; messageAttributes[attributeName] = new MessageAttributeValue { DataType = "String.Array", StringValue = valueString }; } public void AddAttribute(String attributeName, List<int> attributeValue) { String valueString = "[" + String.Join(", ", attributeValue.ToArray()) + "]"; messageAttributes[attributeName] = new MessageAttributeValue { DataType = "String.Array", StringValue = valueString }; } public void AddAttribute(String attributeName, List<Boolean> attributeValue) { String valueString = "[" + String.Join(", ", attributeValue.ToArray()) + "]"; messageAttributes[attributeName] = new MessageAttributeValue { DataType = "String.Array", StringValue = valueString }; } public String Publish(AmazonSimpleNotificationServiceClient snsClient, String topicArn) { PublishRequest request = new PublishRequest { TopicArn = topicArn, MessageAttributes = messageAttributes, Message = message }; PublishResponse result = snsClient.Publish(request); return result.MessageId; } } }

    以下代码摘录初始化并使用示例 SNSMessageAttributes 类。

    // Initialize the example class. SNSMessageAttributes message = new SNSMessageAttributes(messageBody); // Add message attributes with string values. message.AddAttribute("store", "example_corp"); message.AddAttribute("event", "order_placed"); // Add a message attribute with a list of string values. List<String> interestsValues = new List<String>(); interestsValues.Add("soccer"); interestsValues.Add("rugby"); interestsValues.Add("hockey"); message.AddAttribute("customer_interests", interestsValues); // Add a message attribute with a numeric value. message.AddAttribute("price_usd", 1000); // Add a Boolean attribute for filtering using subscription filter policies. // The class applies a String.Array data type to this attribute, allowing it // to be evaluated by a filter policy. List<Boolean> encryptedVal = new List<Boolean>(); encryptedVal.Add(false); message.AddAttribute("encrypted", encryptedVal); // Publish the message. message.Publish(snsClient, topicArn); // Print the MessageId of the published message. Console.WriteLine("MessageId: " + publishResponse.MessageId);
  4. 编译并运行您的代码。

    消息已发布并且已打印 MessageId,例如:

    MessageId: 1234a567-bc89-012d-3e45-6fg7h890123i