В настоящее время мы используем одну очередь 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)*
Как я могу сделать универсальным создание нескольких реализаций класса слушателя по регионам, указанным в конфигурациях?