如何通过两个账户使用AmazonSQS监听器

时间:2019-01-30 13:36:17

标签: java spring amazon-web-services amazon-sqs

我有两个工作人员类的申请。我希望他们从AWS SQS中提取,但要从两个不同的帐户中提取。 我正在使用@SQSListener实现此目的。我在为每个队列设置正确的AmazonSQS客户端时遇到麻烦。尝试使用自定义destionationResolver,但同样无法访问正确的AmazonSQS客户端bean。 我正在使用AmazonSQSAsync,也许这是问题的一部分。惠特自定义目标解析器,我无法访问其中一个队列。 我的配置代码:

@Bean(destroyMethod = "shutdown")
    @Primary
    public AmazonSQSAsync amazonSQS() {

        AmazonSQSAsync amazonSQSAsyncClient = new AmazonSQSAsyncClient(new AWSCredentialsProvider() {
            public void refresh() {}

            public AWSCredentials getCredentials() {
                return new AWSCredentials() {
                    public String getAWSSecretKey() {return secretKey;}

                    public String getAWSAccessKeyId() {return accessKey;}
                };
            }
        });

        QueueBufferConfig config = new QueueBufferConfig();
        config.setMaxBatchOpenMs(maxBatchOpenMs);
        config.setMaxBatchSize(maxBatchSize);

        LOGGER.info("SQS Client Initialized Successfully");
        return new AmazonSQSBufferedAsyncClient(amazonSQSAsyncClient, config);
    }

@Bean(destroyMethod = "shutdown")
    @Qualifier("workerSQS")
    public AmazonSQSAsync workerSQS() {
        final ClientConfiguration cc = new ClientConfiguration();
        cc.setConnectionTimeout(listenerConnectionTimeout);
        cc.setSocketTimeout(listenerSocketTimeout);
        cc.setMaxConnections(listenerMaxConnection);
        cc.setRequestTimeout(listenerRequestTimeout);
        cc.setUseReaper(true);
        //cc.setConnectionMaxIdleMillis();

        AWSCredentialsProvider awsCredentialsProvider = new AWSCredentialsProvider() {
            public void refresh() {}
            public AWSCredentials getCredentials() {
                return new AWSCredentials() {
                    public String getAWSSecretKey() {return routingSecretKey;}

                    public String getAWSAccessKeyId() {return routingAccessKey;}
                };
            }
        };

        AmazonSQSAsync amazonSQSAsyncClient = AmazonSQSAsyncClientBuilder.standard()
                .withCredentials(awsCredentialsProvider)
                .withRegion(Regions.US_EAST_1)
                .withClientConfiguration(cc)
                .build();

        // See https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-client-side-buffering-request-batching.html
        // for QueueBufferConfig Configuration Parameters
        QueueBufferConfig config = new QueueBufferConfig();
        config.setLongPoll(true);

        return new AmazonSQSBufferedAsyncClient(amazonSQSAsyncClient, config);
    }

 @Bean
    public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {
        SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
        msgListenerContainerFactory.setBackOffTime(listenerBackOffTime);
        msgListenerContainerFactory.setWaitTimeOut(listenerWaitTimeOut);
        msgListenerContainerFactory.setVisibilityTimeout(listenerVisibilityTimeOut);
        msgListenerContainerFactory.setMaxNumberOfMessages(listenerMaxMessagesPerPoll);
        msgListenerContainerFactory.setDestinationResolver(destinationResolver());
        return msgListenerContainerFactory;
    }

    @Bean
    public CustomDestinationResolver destinationResolver(){
        return new CustomDestinationResolver();
    }

    @Component
    public static class CustomDestinationResolver implements DestinationResolver{

        @Autowired
        private AmazonSQS amazonSQS;

        @Autowired
        @Qualifier("workerSQS")
        private AmazonSQSAsync amazonSQSAsync;

        @Override
        public String resolveDestination(String name) throws DestinationResolutionException {
            String queueName = name;

            if (queueName.startsWith("tl")) {
                try {
                    GetQueueUrlResult getQueueUrlResult = amazonSQSAsync.getQueueUrl(new GetQueueUrlRequest(name));
                    return getQueueUrlResult.getQueueUrl();
                } catch (QueueDoesNotExistException var4) {
                    throw new DestinationResolutionException(var4.getMessage(), var4);
                }
            } else {
                try {
                    GetQueueUrlResult getQueueUrlResult = amazonSQS.getQueueUrl(new GetQueueUrlRequest(name));
                    return getQueueUrlResult.getQueueUrl();
                } catch (QueueDoesNotExistException var4) {
                    throw new DestinationResolutionException(var4.getMessage(), var4);
                }
            }

        }
    }

1 个答案:

答案 0 :(得分:0)

我无法使用SQS侦听器来执行此操作,因此我尝试使用JMS侦听器并成功了。 我只是创建了两个JMS listenerContainerFactory并使用了它们。每个侦听器都有不同的AWS帐户