Camel jms для внешнего activeMQ с запросом-ответом дает javax.jms.InvalidDestinationException: невозможно опубликовать в удаленном месте назначения:

У нас есть сторонние приложения, которые делают спокойные вызовы конечной точке camel cxfrs, которая затем направляется на внешний activeMQ. Есть приложения, которые используют эти сообщения JMS и предоставляют ответы XML. Все это делается синхронно с использованием верблюда InOut exchangePattern. Архитектура очень прямолинейна и проста. Мы использовали activeMQ 5.5.0-fuse, camel-jms 2.8.x и activemq-pool 5.6.

Используя эту конфигурацию, мы случайно видим это исключение:

 javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-  queue://ID:testserver-37266-1366126830205-0:0:1
    at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1696)
    at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:231)
    at org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:74)
    at org.apache.activemq.pool.PooledProducer.send(PooledProducer.java:55)

Когда это происходит, сервер просто останавливается, и ни одна из наших служб не отвечает, пока мы не перезапустим activeMQ, tomcat и все другие службы.

конфигурация верблюда:

<import resource="classpath:META-INF/cxf/cxf.xml"/>

 <bean id="routeBuilder" class="gov.nasa.arc.tmi.route.TMIServiceRoute"/>

 <bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
     <property name="marshallerProperties" ref="propertiesMap"/>
    </bean>
    <util:map id="propertiesMap">
        <entry key="jaxb.formatted.output">
           <value type="java.lang.Boolean">true</value>
        </entry>
    </util:map>

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <routeBuilder ref="routeBuilder"/>
</camelContext>


<bean id="activemq" 
  class="org.apache.activemq.camel.component.ActiveMQComponent">
  <property name="brokerURL" value="tcp://localhost:61616"/>

Camel Router class: //reroute from("cxfrs:/rr?resourceClasses=x.y.z.route.RerouteResource") .setExchangePattern(ExchangePattern.InOut) .process(new RerouteProcessor()) .to("activemq:queue:x.y.z.tmi.request");

Вот весенняя конфигурация приложения, которое прослушивает очередь: x.y.z.tmi.request использует сообщения JMS:

<context:annotation-config/>
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL">
       <value>tcp://localhost:61616? wireFormat.maxInactivityDurationInitalDelay=30000</value>
    </property>
</bean> 

<bean id="pooledConnectionFactory" 
   class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
   <property name="maxConnections" value="8" />
   <property name="connectionFactory" ref="connectionFactory" />
</bean>

<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="gov.nasa.arc.tmi.request"/>
</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">    
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="defaultDestination" ref="destination" />
</bean> 

<jms:listener-container  connection-factory="pooledConnectionFactory" concurrency="10">
 <jms:listener  destination="gov.nasa.arc.tmi.request" ref="tmiQueryListener" />

После поиска в Google я обнаружил следующие ошибки:

https://issues.apache.org/jira/browse/CAMEL-6229 https://issues.apache.org/jira/browse/AMQ-3457

На основе этого мы обновились до camel 2.10.4, activeMq 5.7 и activemq-pool 5.7. Но даже в этом случае проблема остается.

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

Спасибо.


person myspri    schedule 22.04.2013    source источник
comment
Привет. Вам удалось найти решение своей проблемы? Я сталкиваюсь с тем же, и я не могу найти способ заставить его работать.   -  person Thomas    schedule 24.09.2013


Ответы (1)


Интересно, это потому, что обработка JMS-сообщения на другой стороне занимает слишком много времени, а затем неактивный монитор ActiveMQ удаляет временный пункт назначения, поскольку он неактивен более 30 секунд. http://activemq.apache.org/activemq-inactivitymonitor.html

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

Другой вариант - использовать фиксированные очереди для очередей ответов вместо временных очередей.

person Claus Ibsen    schedule 25.04.2013
comment
Спасибо, попробую первый вариант. Раньше я пробовал фиксированные очереди ответов, но это вызывает множество CLOSE_WAIT на сервере, когда есть несколько одновременных запросов, и приводит к отключению сервера. - person myspri; 26.04.2013