Apache Camel:如何创建 AWS SQS 并订阅 SNS 主题

问题描述 投票:0回答:2

我想创建 AWS SQS,然后将其订阅到现有的 SNS 主题。要使用这种方法,根据 Camel 文档,我必须知道队列 URL。

//create SQS
from("aws-sqs://MyQueue?amazonSQSClient=#client&delay=5000&maxMessagesPerPoll=5")
.startupOrder(1)
.to("mock:result");

//create SNS and subscribe to SQS
from("direct:start")
.startupOrder(2)
.to("aws-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&amazonSQSClient=#amazonSQSClient&subscribeSNStoSQS=true&queueUrl=https://sqs.eu-central-1.amazonaws.com/780410022472/MyQueue");

但是我想使用以前创建的SQS(我知道SQS的名称),但我不知道帐户价值(780410022472)。 如何通过 Camel 创建 SQS 并订阅 SNS,而无需额外信息(例如账户价值)?

java amazon-web-services apache-camel amazon-sqs amazon-sns
2个回答
0
投票

如果您可以通过 CLI 访问 AWS 账户,则可以简单地列出所有现有队列,如下所示:

aws sqs list-queues

这将返回 SQS 队列 URL,如下所示:

https://queue.amazonaws.com/80398EXAMPLE/MyQueue

在上面的示例中,帐号为

80398EXAMPLE

您还可以使用以下命令获取当前 IAM 用户/角色的账户详细信息:

aws sts get-caller-identity

这将返回带有

Account
字段的帐号。


0
投票

我还没有在AWS上尝试过这个解决方案,但我在LocalStack上测试了它,它似乎工作正常:

    class LocalStack extends org.apache.camel.builder.RouteBuilder {
        @Override
        public void configure() throws Exception {
            AwsBasicCredentials credentials = AwsBasicCredentials.create("dummy", "dummy");

            bindToRegistry("amazonSQSClient",
                    SqsClient.builder()
                            .endpointOverride(new URI("http://localhost:4566"))
                            .credentialsProvider(StaticCredentialsProvider.create(credentials))
                            .build());

            bindToRegistry("amazonSNSClient",
                    SnsClient.builder()
                            .endpointOverride(new URI("http://localhost:4566"))
                            .credentialsProvider(StaticCredentialsProvider.create(credentials))
                            .build());

            from("aws2-sqs://MyQueue?amazonSQSClient=#amazonSQSClient&autoCreateQueue=true").to("mock:result");

            Endpoint endpoint = camelContext.getEndpoint("aws2-sqs://MyQueue?amazonSQSClient=#amazonSQSClient&autoCreateQueue=true");
            Assert.assertTrue(endpoint instanceof Sqs2Endpoint);

            SqsClient sqsClient = ((Sqs2Endpoint) endpoint).getClient();
            String url = sqsClient.getQueueUrl(builder -> builder.queueName("MyQueue")).queueUrl();

            from("direct:start")
                    .to("aws2-sns://active_inventory-int-public-outgoing-notifications" +
                            "?autoCreateTopic=true" +
                            "&amazonSNSClient=#amazonSNSClient" +
                            "&subscribeSNStoSQS=true" +
                            "&queueUrl=" + url);
        }

代码应该是不言自明的。需要调用

bindToRegistry
只是因为我正在 LocalStack 上工作,否则默认值应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.