У меня есть два приложения, выполняемые с обеих сторон брокера ActiveMQ; Приложение 1 посылает синхронные запросы на приложение 2, который возвращает ответ обратно приложению 1.Проблема параллелизма с интеграцией Spring - «Не удается опубликовать удаленное назначение»
Применение 1
@MessagingGateway
public interface OrderGateway {
@Gateway(requestChannel = "requestChannel", replyChannel = "responseChannel")
public OrderDto fetchOrder(OrderRequest orderRequest);
}
@Bean
public IntegrationFlow outgoingRequestFlow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from("requestChannel")
.handle(Jms.outboundGateway(connectionFactory).requestDestination("order.queue"))
.get();
}
Применение 2
@Bean
public IntegrationFlow incomingRequestFlow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(Jms.inboundGateway(connectionFactory).destination("order.queue"))
.channel("requestChannel")
.handle("orderServiceActivator", "fetchOrder")
.channel("responseChannel")
.get();
}
@Component
public class OrderServiceActivator {
@Autowired
OrderService orderService;
@ServiceActivator
public OrderDto fetchOrder(OrderRequest orderRequest) {
return orderService.getById(orderRequest.getId());
}
}
Оба приложения содержат следующие соединения брокера заводская конфигурация:
@Bean(destroyMethod = "stop")
public PooledConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL("tcp://broker.local:61616");
return new PooledConnectionFactory(activeMQConnectionFactory);
}
Я создал контроллер REST в приложении 1 /myapp/order/{id}
, который отправляет запрос orderGateway.fetchOrder
, который работает нормально. Затем я протестировал его, запустив while true; do curl http://localhost:8080/myapp/order/1; done
в командной строке и оставив его в течение нескольких минут, который отправил сотни запросов через приложение, никаких ошибок, все было в порядке. Я вижу, что request.queue
задерживает и удаляет сообщения в инструменте администратора ActiveMQ, а ActiveMQ.Advisory.TempQueue
также имеет высокий счет очереди/декомпрессии.
Проблема возникает, когда есть параллельные запросы; если открыть два окна терминала и запустить завиток-петля в обоих окнах, очень быстро я начинаю видеть следующие ошибки:
Sep 21, 2015 4:35:25 PM org.springframework.jms.listener.DefaultMessageListenerContainer invokeErrorHandler
WARNING: Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:Stans-MacBook-Pro.local-64816-1442849675850-1:1:559
Является ли моя конфигурация SI неправильно? Существуют ли другие параметры конфигурации, которые мне нужно применить? Спасибо за любые рекомендации.
Спасибо за ответ Гэри. Я собираюсь сосредоточиться на создании именованного адресата ответа, чтобы узнать, сохраняется ли ошибка. Я создал отдельный вопрос об этом вместо редактирования этого. –