Activemq 即使cachelevel设置为CACHE\u Consumer,使用者队列也会删除

Activemq 即使cachelevel设置为CACHE\u Consumer,使用者队列也会删除,activemq,apache-camel,Activemq,Apache Camel,我意识到,即使在明确设置属性之后 <property name="cacheLevelName" value="CACHE_CONSUMER"/> 请参见下面我的驼峰弹簧配置: <bean id="providerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <!--<property name="brokerURL"><value>${a

我意识到,即使在明确设置属性之后

<property name="cacheLevelName" value="CACHE_CONSUMER"/>
请参见下面我的驼峰弹簧配置:

<bean id="providerConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--<property name="brokerURL"><value>${aero-provider-broker-url}</value></property>-->


${提供程序代理url}
在此处编辑>>>

BEan定义:

   <bean id="localJMSConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="alwaysSessionAsync" value="false"/>
    <property name="alwaysSyncSend" value="true"/>
    <property name="brokerURL"><value>${local-broker-url}</value></property>
    <property name="closeTimeout" value="150000"/>
    <property name="copyMessageOnSend" value="true"/>
    <property name="disableTimeStampsByDefault" value="false"/>
    <property name="dispatchAsync" value="false"/>
    <property name="objectMessageSerializationDefered" value="false"/>
    <property name="optimizeAcknowledge" value="false"/>
    <property name="optimizedMessageDispatch" value="true"/>
    <property name="producerWindowSize" value="0"/>
    <property name="statsEnabled" value="false"/>
    <property name="useAsyncSend" value="false"/>
    <property name="useCompression" value="false"/>
    <property name="sendTimeout" value="0"/>
</bean> 
<bean id="localJMSTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="localJMSConnectionFactory" />               
</bean> 
<bean id="localRequestJMSConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="localJMSConnectionFactory"/>
    <property name="concurrentConsumers" value="${jms-concurrent-consumers}"/>
    <property name="deliveryPersistent" value="true"/>
    <property name="priority" value="9"/>
</bean> 
<bean id="localRequestJMS" class="org.apache.camel.component.jms.JmsComponent">
    <property name="configuration" ref="localRequestJMSConfig"/>        
</bean>
<camel:endpoint id="jmsEndpoint" camelContextId="bohProcessorCC" uri="localRequestJMS:queue:${boh-processor-queue}"/>

<camel:endpoint id="providerEndpoint" camelContextId="bohProcessorCC" uri="providerActivemq:queue:${generic-http-provider-queue}?exchangePattern=InOut&amp;requestTimeout=${jms-request-timeout}&amp;replyTo=reply"/>

${本地代理url}
点定义:

   <bean id="localJMSConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="alwaysSessionAsync" value="false"/>
    <property name="alwaysSyncSend" value="true"/>
    <property name="brokerURL"><value>${local-broker-url}</value></property>
    <property name="closeTimeout" value="150000"/>
    <property name="copyMessageOnSend" value="true"/>
    <property name="disableTimeStampsByDefault" value="false"/>
    <property name="dispatchAsync" value="false"/>
    <property name="objectMessageSerializationDefered" value="false"/>
    <property name="optimizeAcknowledge" value="false"/>
    <property name="optimizedMessageDispatch" value="true"/>
    <property name="producerWindowSize" value="0"/>
    <property name="statsEnabled" value="false"/>
    <property name="useAsyncSend" value="false"/>
    <property name="useCompression" value="false"/>
    <property name="sendTimeout" value="0"/>
</bean> 
<bean id="localJMSTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
    <property name="connectionFactory" ref="localJMSConnectionFactory" />               
</bean> 
<bean id="localRequestJMSConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="localJMSConnectionFactory"/>
    <property name="concurrentConsumers" value="${jms-concurrent-consumers}"/>
    <property name="deliveryPersistent" value="true"/>
    <property name="priority" value="9"/>
</bean> 
<bean id="localRequestJMS" class="org.apache.camel.component.jms.JmsComponent">
    <property name="configuration" ref="localRequestJMSConfig"/>        
</bean>
<camel:endpoint id="jmsEndpoint" camelContextId="bohProcessorCC" uri="localRequestJMS:queue:${boh-processor-queue}"/>

<camel:endpoint id="providerEndpoint" camelContextId="bohProcessorCC" uri="providerActivemq:queue:${generic-http-provider-queue}?exchangePattern=InOut&amp;requestTimeout=${jms-request-timeout}&amp;replyTo=reply"/>

骆驼路线:

 <from ref="jmsEndpoint"/>
 <bean ref="service" method="getSignInRequest"/> 
 <transform><simple>XML=${in.body}</simple></transform> 
 <inOut ref="providerEndpoint"/> 
 <bean ref="service" method="getSignInResponseData"/>  
 <bean ref="utilityServicesBean" method="process"/> 
 <bean ref="service" method="getPassword"/> 
 <inOut ref="providerEndpoint"/> 
 <bean ref="camelPropertyEnricherBean" method="addCustReference"/> 
 <bean ref="camelPropertyEnricherBean" method="normalizeXML"/> 
 <inOut ref="providerEndpoint"/>

XML=${in.body}

在第二次呼叫中,交换超时,通常是超时。回复队列上通常有响应,但日志显示相关id不匹配。我注意到,如果我在调用提供者端点之前要求camel将消息id设置为相关id,它通常会返回一条消息。即使在高流量的情况下,这种方法有时也会失败。

您将通过JMS的请求/回复与Camel一起使用,例如您可以使用inOut ref=“providerEndpoint”,它还使用一个固定的replyTo队列名称,如您指定的replyTo=reply

这意味着Camel强制使用CACHE_会话,因为应答队列被视为共享应答队列,Camel使用JMS消息选择器根据相关id拾取预期的应答消息。为了更新JMS消息选择器,您需要重新创建使用者。这就是为什么您会在日志中看到消费者被删除的原因。这就是消费者的回答


在Camel 2.9以后的版本中,我们引入了replyToType选项,您可以将其设置为replyToType=Exclusive。然后回复队列被认为是独占的,这意味着Camel将使用CACHE\u CONSUMER。

您可以包括路由吗?从表面上看,你在做某种请求-回复,但并不清楚。XML=${in.body}这些看起来不完整。请您将它们与camelContext和from标记一起编辑到问题中好吗?问题可能是因为我正在重新使用端点吗?除了升级到2.9之外,我还可以如何绕过此问题并确保获得答复?重新使用相关Id发送请求/答复消息意味着什么?见上文第4行和第8行。我回答了您关于封闭消费者的问题。如果你有其他类型的问题,那么用新的Q问