С помощью AWS Java SDK v1 вы можете подписать очередь SQS на тему SNS, используя метод Topics.subscribeQueue, где объект конечная точка занимает в queueUrl , как показано ниже:
Topics.subscribeQueue(sns, sqs, myTopicARN, queueURL);
С помощью AWS Java SDK v2 вы можете подписать очередь SQS на тему SNS с помощью метода SunscribeRequest.builder, где объект конечная точка принимает queueArn.
Ниже приведен пример фрагмента кода Java, который я протестировал для успешной подписки очереди SQS на тему SNS:
public static void subscribeSQStoSNS(String queueUrl, String topicArn, SqsClient sqsClient, SnsClient snsClient) {
/* with AWS Java SDK v1, you could subscribe an SQS queue to an SNS topic by
* calling "Topics.subscribeQueue"()[1] where the endpoint object takes in queueUrl.
*
* with AWS Java SDK v2, to subscribe an SQS queue to an SNS topic
* one needs to use "SunscribeRequest.builder"() [2] where the endpoint object takes in queueArn.
*
* [1] https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sns/util/Topics.html
* [2] https://sdk.amazonaws.com/java/api/2.0.0-preview-11/software/amazon/awssdk/services/sns/model/SubscribeRequest.Builder.html
*
*/
// Step 1: We call "get-queue-attributes" API to retrieve the SQS queue Arn
GetQueueAttributesRequest QueueAttributesRequest = GetQueueAttributesRequest.builder()
.queueUrl(queueUrl)
.attributeNamesWithStrings("All")
.build();
GetQueueAttributesResponse QueueAttributesResult = sqsClient.getQueueAttributes(QueueAttributesRequest);
Map<String, String> sqsAttributeMap = QueueAttributesResult.attributesAsStrings();
System.out.println("\n\n"+ QueueAttributesRequest);
String queueArn = sqsAttributeMap.get("QueueArn");
//System.out.println("\n\n"+ queueArn);
// Step 2: We call "SubscribeRequest.builder" to subscribe the SQS queue to the SNS topic
SubscribeRequest Qrequest = SubscribeRequest.builder()
.protocol("sqs")
.endpoint(queueArn)
.returnSubscriptionArn(true)
.topicArn(topicArn)
.build();
SubscribeResponse Qresponse = snsClient.subscribe(Qrequest);
System.out.println("\n\nCreated Subscription ARN: " + Qresponse.subscriptionArn()+ " " + " and StatusCode : " + Qresponse.sdkHttpResponse().statusCode());}
Примечание.
1. Метод «Topics.subscribeQueue» () автоматически создает политику для подписки, позволяющую теме отправлять сообщения в очередь.
2. Метод SunscribeRequest.builder () не добавляет автоматически политику для подписки (то есть очередь SQS), чтобы разрешить тема SNS для отправки сообщений в очередь. Поэтому убедитесь, что вы предоставили теме SNS разрешение на публикацию в очереди SQS, добавив следующий образец политики в очередь SQS, как показано ниже, а также как описано здесь:
{
"Statement": [{
"Effect":"Allow",
"Principal":"*",
"Action":"sqs:SendMessage",
"Resource":"arn:aws:sqs:us-east-2:123456789012:MyQueue",
"Condition":{
"ArnEquals":{
"aws:SourceArn":"arn:aws:sns:us-east-2:123456789012:MyTopic"
}
}
}]
}
Вы можете найти полный код в github здесь: https://gist.github.com/syumaK/79c946ed4e6180c1 / а>
Надеюсь это поможет.
person
syumaK
schedule
09.12.2019
topicArn
иqueueUrl
? - person stdunbar   schedule 05.12.2019