来自不同 AWS 区域的多个 SQS 侦听器
Multiple SQS Listeners from different AWS regions
我们目前使用单个 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)*
我怎样才能使它通用以按配置中指定的区域创建多个侦听器 class 实现?
虽然没有直接的方法使用 spring 框架的注释来创建侦听器来侦听多个 AWS 区域中的多个队列(多个 AWS 区域中的相同队列名称),但我能够通过编程解决上述问题每个区域的 JMS 容器工厂 bean、每个区域的 JMS 模板和每个区域的 JMS 侦听器的配置。
我将在接下来的几天 post 示例代码,这可能对社区有用。
您可以收听来自不同地区的 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) {}
我们目前使用单个 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)*
我怎样才能使它通用以按配置中指定的区域创建多个侦听器 class 实现?
虽然没有直接的方法使用 spring 框架的注释来创建侦听器来侦听多个 AWS 区域中的多个队列(多个 AWS 区域中的相同队列名称),但我能够通过编程解决上述问题每个区域的 JMS 容器工厂 bean、每个区域的 JMS 模板和每个区域的 JMS 侦听器的配置。
我将在接下来的几天 post 示例代码,这可能对社区有用。
您可以收听来自不同地区的 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) {}