来自不同AWS区域的多个SQS侦听器

时间:2019-05-31 14:10:47

标签: amazon-web-services spring-boot amazon-sqs spring-jms region

我们当前正在使用一个SQS队列来处理消息。 但是,作为功能的扩展,我们需要使用相同的队列名称来支持多个区域。

jmsListener的当前实现绑定到给定区域中的给定SQS队列,如下所示:

SQSListener.java

@Component
public class SQSListener {

    @Override
    @JmsListener(destination = "${QueueName}", concurrency = "${JmsThreadCount}")
    public void onMessage(Message message) throws JMSException {

    }

SQSConfiguration.java

@Component
@EnableJms
public class SQSConfig {
    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
         DefaultJmsListenerContainerFactory factory = null;
         try {
             factory = new DefaultJmsListenerContainerFactory();
             factory.setConnectionFactory(getSqsConnectionFactory()); //passes credentials in local method call
             factory.setDestinationResolver(new DynamicDestinationResolver());
             factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
         } catch (Exception e) {
             logger.error(e.getLocalizedMessage());
         }
         return factory;
    }



}

Application.properties

QueueName=xyz
JmsThreadCount=1-5
Regions=us-east-1, us-west-2 #*(newly added region)*

如何通过配置中指定的区域通用创建多个侦听器类实现?

2 个答案:

答案 0 :(得分:0)

尽管没有直接的方法使用Spring框架的注释来创建侦听器来侦听多个AWS区域中的多个队列(多个AWS区域中的相同队列名称),但是我能够通过JMS Container Factory Bean的程序化配置解决了上述问题每个区域,每个区域的JMS模板和每个区域的JMS侦听器。

我将在接下来的几天中发布示例代码,这可能对社区有用。

答案 1 :(得分:0)

您可以收听来自不同地区的SQS。如果不提供队列名称,而是提供SQS的完整https URL。我已经在我的应用程序中应用了它,并且有效

例如SQS http URL-https://sqs.us-west-2.amazonaws.com/YOURACCOUNTNUMBER/YOURQUEUENAME

@SqsListener(value = "https://sqs.us-west-2.amazonaws.com/123456789/MYQUEUENAME
", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
protected void queueListener(String dataFomSQS, @Header("Acknowledgment") Acknowledgment acknowledgment) {}