驼峰jms到外部activeMQ,请求回复为javax.jms.InvalidDestinationException:无法发布到已删除的目标:

驼峰jms到外部activeMQ,请求回复为javax.jms.InvalidDestinationException:无法发布到已删除的目标:,jms,activemq,apache-camel,connection-pooling,jmstemplate,Jms,Activemq,Apache Camel,Connection Pooling,Jmstemplate,我们有第三方应用程序,它们对camel cxfrs端点进行restful调用,然后将其路由到外部activeMQ。有些应用程序使用这些JMS消息并提供XML响应。这一切都是使用camel InOut exchangePattern同步完成的。该架构非常直接和简单。我们使用的是activeMQ 5.5.0-fuse、camel jms 2.8.x和activeMQ池5.6 使用此配置,我们可以在随机时间看到此异常: javax.jms.InvalidDestinationException: C

我们有第三方应用程序,它们对camel cxfrs端点进行restful调用,然后将其路由到外部activeMQ。有些应用程序使用这些JMS消息并提供XML响应。这一切都是使用camel InOut exchangePattern同步完成的。该架构非常直接和简单。我们使用的是activeMQ 5.5.0-fuse、camel jms 2.8.x和activeMQ池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"/>

真的

驼峰路由器等级: //改道 from(“cxfrs:/rr?资源类=x.y.z.route.Reroute资源”) .setExchangePattern(ExchangePattern.InOut) .process(新的重新路由处理器()) .to(“activemq:queue:x.y.z.tmi.request”)

以下是侦听队列的应用程序的spring配置: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" />

tcp://localhost:61616? wireFormat.maxInactivityDurationInitalDelay=30000

在谷歌搜索之后,我发现了这些错误:

在此基础上,我们升级到camel 2.10.4、activeMq 5.7和activeMq池5.7。即便如此,问题依然存在

我真的被卡住了,不知道如何解决这个问题。有人能指出可能的错误吗


谢谢。

我想知道这是否是因为在另一端处理JMS消息花费的时间太长,然后ActiveMQ的非活动监视器会删除临时目标,因为它已处于非活动状态超过30秒

可能尝试将超时设置为更高的值,或者禁用它


另一个选项是使用固定队列代替临时队列进行回复。

谢谢,我们将尝试第一个选项。我之前尝试过固定回复队列,但当有多个并发请求时,它会导致服务器上大量的关闭等待,并导致服务器停机。您好。你找到解决问题的办法了吗?我也面临同样的问题,在工作中我找不到任何赚钱的方法。