Привет, Необходимо в рамках одного приложения использовать две очереди в ActiveMQ и одну в SQS (Amazon Web Serivces Simple Queue Service).
С подключением и работой с каждым из сервисом проблем не возникало, однако возникла проблема при одновременном использовании вышеперечисленных сервисов. А именно, Spring создает автоматически очереди в ActiveMQ, игнорируя очередь в SQS (он создает её в ActiveMQ broker), что собственно нарушает всю работу приложения.
Я создал конфигурационные файлы для SQS
| Код | @EnableJms @Configuration public class JmsConfig { SQSConnectionFactory connectionFactory = SQSConnectionFactory.builder() .withRegion(Region.getRegion(Regions.US_WEST_1)) .withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain()) .build(); @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(){ DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(this.connectionFactory); factory.setDestinationResolver(new DynamicDestinationResolver()); factory.setConcurrency("3-10"); return factory; }
@Bean public JmsTemplate defaultJmsTemplate(){ return new JmsTemplate(this.connectionFactory); }
}
|
И для ActiveMQ
| Код | @Configuration public class MessagingConfiguration {
private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616";
@Bean public ActiveMQConnectionFactory connectionFactory(){ ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL(DEFAULT_BROKER_URL); return connectionFactory; } }
|
| Код |
@Configuration @EnableJms public class MessagingListnerConfiguration {
@Autowired ConnectionFactory connectionFactory;
@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setConcurrency("10-50"); return factory; }
}
|
Ну и соответственно у меня есть два Listener'a, которые слушают эти очереди и используют аннотации.
Это код ActiveMQ Listener'a
| Код | @JmsListener(destination = "request.queue") @SendTo("response.queue") public String receiveRequest(Order order){ //forward message from request to response }
|
Ну и наконец код для SQS
| Код | @Override @JmsListener(destination = "proxies-queue") public void onMessage(Message message) { try{ Order order = new Order(((TextMessage) message).getText()); storeService.save(order); }catch (Exception e){ e.printStackTrace(); } }
|
Прощу прощения за некоторый беспорядок в коде, так как читаю гайды, разбираюсь в работе всего этого. Вот ещё https://github.com/nukede/titan-proxy/tree/master/titan-proxy-backend на приложение, может будет понятнее. Буду рад любой помощи
|