在我的应用程序中,我需要向指定的主题名称发送消息。该主题已由其他人创建,并且在配置文件中他们只提供了主题名称。我的工作是将消息推送到给定的主题名称中。是否有一种方法可以通过主题名称在Java中获取主题ARN?
在我的应用程序中,我需要向指定的主题名称发送消息。该主题已由其他人创建,并且在配置文件中他们只提供了主题名称。我的工作是将消息推送到给定的主题名称中。是否有一种方法可以通过主题名称在Java中获取主题ARN?
如答案所述,使用createTopic(topicName)是一种更直接的方法。如果主题已经被创建,它只会返回主题ARN。
我有两种方法来完成这个任务。ARN的格式总是相同的。因此,您可以订阅“arn:aws:sns:<region>:<account>:<name>”,其中:
区域信息从Regions.getCurrentRegion()中获取。请注意,这是一个比较费时的调用,并且您需要处理不在EC2 / Elastic Beanstalk实例上的情况。
账户信息从AmazonIdentityManagementClient.getUser().getUser().getArn()中获取。您需要从中解析出账户号码。同样要注意,如果不在EC2环境中,也需要进行特殊处理。
名称就是您想要的。
更简单的方法是遍历主题并查找ARN中所需名称。您将使用AmazonSNSClient listTopics方法来完成此操作。请记住,该方法仅返回前100个主题-您需要适当地循环遍历整个主题列表。
import json
import boto3
def lambda_handler(event, context):
try:
topic = event['topic']
subject = event['subject']
body = event['body']
subscriber = event['subscriber']
sns_client = boto3.client('sns')
sns_topic_arn = [tp['TopicArn'] for tp in sns_client.list_topics()['Topics'] if topic in tp['TopicArn']]
sns_client.publish(TopicArn = sns_topic_arn[0], Message=body,
Subject=subject)
except Exception as e:
print(e)
event
参数是什么? - alltejprivate static Optional<Topic> getTopicByName(SnsClient snsClient,
String topicName) {
for (val topicsResponse : snsClient.listTopicsPaginator()) {
if (topicsResponse.hasTopics()) {
for (val topic : topicsResponse.topics()) {
// Arn format => arn:aws:sns:region:account-id:topic-name
val arn = topic.topicArn();
val sp = arn.split(":");
if (topicName.equals(sp[sp.length - 1])) {
return Optional.of(topic);
}
}
}
}
return Optional.empty();
}