2015-09-21 1 views
1

У меня есть два приложения, выполняемые с обеих сторон брокера 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 неправильно? Существуют ли другие параметры конфигурации, которые мне нужно применить? Спасибо за любые рекомендации.

ответ

1

Мне нужно будет просмотреть журнал отладки с обеих сторон, чтобы выяснить, что происходит - это означает, что клиентская сторона таймаута; однако тайм-аут по умолчанию составляет 5 секунд. Вы можете увеличить receiveTimeout на исходящем шлюзе.

При этом обычно лучше использовать именованное назначение ответа, чтобы избежать создания временной очереди ответа для каждого запроса. Имейте в виду, что там же применяется тайм-аут.

+0

Спасибо за ответ Гэри. Я собираюсь сосредоточиться на создании именованного адресата ответа, чтобы узнать, сохраняется ли ошибка. Я создал отдельный вопрос об этом вместо редактирования этого. –

Смежные вопросы