本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon Simple Notification Service
利用 Amazon Simple Notification Service,您可以通过多个通信通道轻松地将实时通知消息从您的应用程序推送给订阅者。本主题介绍如何执行Amazon SNS.
创建主题
主题是通信通道的逻辑分组,可定义要将消息发送到的系统,例如,将消息发送到 Amazon Lambda 和 HTTP Webhook。将消息发送到 Amazon SNS 之后,这些消息将分发到主题中定义的各个通道。这将使订阅者能够收到这些消息。
要创建主题,请先构建一个 CreateTopicRequest 对象,并使用构建器中的 name()
方法设置主题的名称。然后,将请求对象发送到Amazon SNS通过使用createTopic()
的方法SnsClient. 可以将此请求的结果作为 CreateTopicResponse 对象捕获,如以下代码段中所示。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.CreateTopicRequest; import software.amazon.awssdk.services.sns.model.CreateTopicResponse; import software.amazon.awssdk.services.sns.model.SnsException;
代码
public static String createSNSTopic(SnsClient snsClient, String topicName ) { CreateTopicResponse result = null; try { CreateTopicRequest request = CreateTopicRequest.builder() .name(topicName) .build(); result = snsClient.createTopic(request); return result.topicArn(); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }
请参阅 GitHub 上的完整示例
列出你的Amazon SNS话题
要检索现有 Amazon SNS 主题的列表,请构建一个 ListTopicsRequest 对象。然后,使用 SnsClient
的 listTopics()
方法将请求对象发送到 Amazon SNS。可以将此请求的结果作为 ListTopicsResponse 对象捕获。
以下代码段输出请求的 HTTP 状态代码以及您的 Amazon SNS 主题的 Amazon 资源名称 (ARN) 列表。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.ListTopicsRequest; import software.amazon.awssdk.services.sns.model.ListTopicsResponse; import software.amazon.awssdk.services.sns.model.SnsException;
代码
public static void listSNSTopics(SnsClient snsClient) { try { ListTopicsRequest request = ListTopicsRequest.builder() .build(); ListTopicsResponse result = snsClient.listTopics(request); System.out.println("Status was " + result.sdkHttpResponse().statusCode() + "\n\nTopics\n\n" + result.topics()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
请参阅 GitHub 上的完整示例
为终端节点订阅主题
创建主题后,您可以配置将哪些通信通道作为该主题的终端节点。在 Amazon SNS 收到消息后,消息将分发给这些终端节点。
要将通信通道配置为主题的终端节点,请为该终端节点订阅主题。首先,请构建一个 SubscribeRequest 对象。指定通信通道(例如,lambda
要么email
) 作为protocol()
. 设置endpoint()
到相关的输出位置(例如,Lambda函数或电子邮件地址),然后将要订阅的主题的 ARN 设置为topicArn()
. 将请求对象发送到Amazon SNS通过使用subscribe()
的方法SnsClient
. 可以将此请求的结果作为 SubscribeResponse 对象捕获。
以下代码段说明如何为电子邮件地址订阅主题。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.SubscribeRequest; import software.amazon.awssdk.services.sns.model.SubscribeResponse;
代码
public static void subEmail(SnsClient snsClient, String topicArn, String email) { try { SubscribeRequest request = SubscribeRequest.builder() .protocol("email") .endpoint(email) .returnSubscriptionArn(true) .topicArn(topicArn) .build(); SubscribeResponse result = snsClient.subscribe(request); System.out.println("Subscription ARN: " + result.subscriptionArn() + "\n\n Status is " + result.sdkHttpResponse().statusCode()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
请参阅 GitHub 上的完整示例
向主题发布消息
如果您拥有一个主题并且已为该主题配置一个或多个终端节点,则可向该主题发布消息。首先,请构建一个 PublishRequest 对象。指定要发送的 message()
,并指定要将消息发送到的主题的 ARN (topicArn()
)。然后,使用 SnsClient
的 publish()
方法将请求对象发送到 Amazon SNS。可以将此请求的结果作为 PublishResponse 对象捕获。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.PublishRequest; import software.amazon.awssdk.services.sns.model.PublishResponse; import software.amazon.awssdk.services.sns.model.SnsException;
代码
public static void pubTopic(SnsClient snsClient, String message, String topicArn) { try { PublishRequest request = PublishRequest.builder() .message(message) .topicArn(topicArn) .build(); PublishResponse result = snsClient.publish(request); System.out.println(result.messageId() + " Message sent. Status is " + result.sdkHttpResponse().statusCode()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
请参阅 GitHub 上的完整示例
为终端节点取消订阅主题
可以删除配置为主题的终端节点的通信通道。执行此操作后,主题本身将继续存在,并会将消息分发到为该主题配置的任何其他终端节点。
要删除作为主题的终端节点的通信通道,请为该终端节点取消订阅主题。首先,请构建一个 UnsubscribeRequest 对象,并将要取消订阅的主题的 ARN 设置为 subscriptionArn()
。然后,使用 SnsClient
的 unsubscribe()
方法将请求对象发送到 SNS。可以将此请求的结果作为 UnsubscribeResponse 对象捕获。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.SnsException; import software.amazon.awssdk.services.sns.model.UnsubscribeRequest; import software.amazon.awssdk.services.sns.model.UnsubscribeResponse;
代码
public static void unSub(SnsClient snsClient, String subscriptionArn) { try { UnsubscribeRequest request = UnsubscribeRequest.builder() .subscriptionArn(subscriptionArn) .build(); UnsubscribeResponse result = snsClient.unsubscribe(request); System.out.println("\n\nStatus was " + result.sdkHttpResponse().statusCode() + "\n\nSubscription was removed for " + request.subscriptionArn()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
请参阅 GitHub 上的完整示例
删除主题
要删除 Amazon SNS 主题,请先构建一个 DeleteTopicRequest 对象,并将主题的 ARN 设置为构建器中的 topicArn()
方法。然后,使用 SnsClient
的 deleteTopic()
方法将请求对象发送到 Amazon SNS。可以将此请求的结果作为 DeleteTopicResponse 对象捕获,如以下代码段中所示。
导入
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.DeleteTopicRequest; import software.amazon.awssdk.services.sns.model.DeleteTopicResponse; import software.amazon.awssdk.services.sns.model.SnsException;
代码
public static void deleteSNSTopic(SnsClient snsClient, String topicArn ) { try { DeleteTopicRequest request = DeleteTopicRequest.builder() .topicArn(topicArn) .build(); DeleteTopicResponse result = snsClient.deleteTopic(request); System.out.println("\n\nStatus was " + result.sdkHttpResponse().statusCode()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
请参阅 GitHub 上的完整示例
有关更多信息,请参见《Amazon Simple Notification Service 开发人员指南》。