如何在Java中将SQS队列订阅到SNS主题

时间:2019-02-08 11:16:07

标签: amazon-web-services aws-java-sdk

当我创建一个新队列并将其订阅Java中的主题时,没有消息出现。通过AWS Web控制台也可以正常工作。

我想我必须以某种方式确认订阅,但是sns.confirmSubscription方法需要令牌-我应该从哪里获得?

这是我的Java代码:

String queueURL = sqs.createQueue("my-queue").getQueueUrl();

sns.subscribe(myTopicARN, "sqs", queueURL);

sns.publish(myTopicARN, "{\"payload\":\"test\"}");

sqs.receiveMessage(queueURL).getMessages()
        .forEach(System.out::println);  // nothing

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

查看以下内容:https://aws.amazon.com/blogs/developer/subscribing-queues-to-topics/

您应该这样订阅:

Topics.subscribeQueue(sns, sqs, myTopicARN, queueURL);

此便捷方法为订阅创建策略,以允许主题将消息发送到队列。

答案 1 :(得分:0)

将队列订阅到sns 不会自动创建允许sns 向队列发送消息的策略(根据我使用sns/sqs 的经验),因此您需要自己创建策略并授予sns 向队列发送消息的权限你的队列这是一个例子,说明如何使用队列 url 、队列 arn 和主题 arn

import static com.amazonaws.auth.policy.Principal.All;
import static com.amazonaws.auth.policy.Statement.Effect.Allow;
import static com.amazonaws.auth.policy.actions.SQSActions.SendMessage;
import static com.amazonaws.auth.policy.conditions.ArnCondition.ArnComparisonType.ArnEquals;

final Statement mainQueueStatements = new Statement(Allow) //imported above
        .withActions(SendMessage) //imported above
            .withPrincipals(All) //imported above
            .withResources(new Resource(queueArn)) // your queue arn
            .withConditions(
                    new Condition()
                            .withType(ArnEquals.name()) //imported above
                            .withConditionKey(SOURCE_ARN_CONDITION_KEY) //imported above
                            .withValues(topicArn) // your topic arn
            );
    final Policy mainQueuePolicy = ()
            .withId("MainQueuePolicy")
            .withStatements(mainQueueStatements);
    final HashMap<QueueAttributeName, String> attributes = new HashMap<>();
     attributes.put(QueueAttributeName.Policy.toString(), mainQueuePolicy.toJson());
    amazonSQS.setQueueAttributes(new SetQueueAttributesRequest().withAttributes(attributes).withQueueUrl(queueUrl)); // your queue url