Apache Camel如何创建AWS SQS并订阅已有SNS主题?
解决方法
你无需硬编码AWS账号ID拼接队列URL,可通过以下两种方案实现需求:
方案1:运行时动态获取队列URL
Camel配套的AWS SDK提供了仅通过队列名称查询完整URL的接口,你可以在SNS订阅逻辑前加一个处理步骤动态获取URL,再传入SNS组件即可,示例代码如下:
// 创建SQS队列(如果不存在)并消费消息 from("aws-sqs://MyQueue?amazonSQSClient=#amazonSQSClient&delay=5000&maxMessagesPerPoll=5") .startupOrder(1) .to("mock:result"); // 动态获取队列URL后完成SNS订阅 from("direct:start") .startupOrder(2) .process(exchange -> { AmazonSQS sqsClient = exchange.getContext().getRegistry() .lookupByNameAndType("amazonSQSClient", AmazonSQS.class); // 仅传入队列名即可拿到完整队列URL,无需手动拼接账号、区域信息 String queueUrl = sqsClient.getQueueUrl("MyQueue").getQueueUrl(); // 将URL写入SNS组件识别的消息头,优先级高于URI里的静态参数 exchange.getIn().setHeader("CamelAwsSnsQueueUrl", queueUrl); }) .to("aws-sns://test-camel-sns1?amazonSNSClient=#amazonSNSClient&amazonSQSClient=#amazonSQSClient&subscribeSNStoSQS=true");
CamelAwsSnsQueueUrl是Camel AWS SNS组件官方定义的动态参数头,运行时传入的该参数会覆盖端点URI中配置的静态queueUrl值。
方案2:使用高版本Camel的自动补全特性
如果你使用的是3.10及以上版本的Camel AWS SNS组件,组件本身支持仅传入队列名称,会自动通过AWS客户端获取当前账号、区域信息补全队列URL/ARN,无需你手动填写账号ID。
内容的提问来源于stack exchange,提问作者Mykola Afanasiev
相关产品推荐
相关产品推荐

