Apache camel 使用ActiveMQ PooledConnectionFactory卸载Blueprint bundle会导致javax.jms.IllegalStateException:使用者已关闭

Apache camel 使用ActiveMQ PooledConnectionFactory卸载Blueprint bundle会导致javax.jms.IllegalStateException:使用者已关闭,apache-camel,activemq,apache-karaf,blueprint-osgi,Apache Camel,Activemq,Apache Karaf,Blueprint Osgi,我正在使用Camel(试用2.15.2和2.16.3)和activemq Camel(试用5.12.1和5.13.3)组件将捆绑包中的路由连接到外部activemq服务器。bundle部署在Karaf中(尝试了3.0.5和4.0.5),并通过蓝图上下文(包含Camel上下文)启动。有问题的捆绑包只包含一个amq生产者 只要未交换任何消息,卸载/重新启动捆绑包就没有问题。但在第一次消息交换后的任何时候,卸载捆绑包时,我都会收到javax.jms.IllegalStateException: 201

我正在使用Camel(试用2.15.2和2.16.3)和
activemq Camel
(试用5.12.1和5.13.3)组件将捆绑包中的路由连接到外部activemq服务器。bundle部署在Karaf中(尝试了3.0.5和4.0.5),并通过蓝图上下文(包含Camel上下文)启动。有问题的捆绑包只包含一个amq生产者

只要未交换任何消息,卸载/重新启动捆绑包就没有问题。但在第一次消息交换后的任何时候,卸载捆绑包时,我都会收到javax.jms.IllegalStateException:

2016-05-30 17:12:51,937 | WARN  | V.XACML.REQUEST] | TemporaryQueueReplyManager       | 75 - org.apache.camel.camel-jms -
2.16.3 | ID-Ralfs-MacBook-Pro-local-59456-1464621134397-7-2 | Exception inside the DMLC for Temporary ReplyTo Queue for destination DEV.XACML.REQUEST, refreshing ReplyTo destination javax.jms.IllegalStateException: The Consumer is closed
    at org.apache.activemq.ActiveMQMessageConsumer.checkClosed(ActiveMQMessageConsumer.java:880)[64:org.apache.activemq.activemq-osgi:5.13.3]
    at org.apache.activemq.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:641)[64:org.apache.activemq.activemq-osgi:5.13.3]
    at org.apache.activemq.jms.pool.PooledMessageConsumer.receive(PooledMessageConsumer.java:67)[64:org.apache.activemq.activemq-osgi:5.13.3]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:430)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:310)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1103)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1095)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:992)[106:org.apache.servicemix.bundles.spring-jms:3.2.14.RELEASE_1]
    at java.lang.Thread.run(Thread.java:745)[:1.8.0_77]
这将导致无限次重新尝试连接回临时队列:

2016-05-30 17:12:51,940 | WARN  | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 | ID-Ralfs-MacBook-Pro-local-59456-1464621134397-7-2 | Setup of JMS message listener invoker failed for destination 'temporary' - trying to recover. Cause: The Consumer is closed
2016-05-30 17:12:51,941 | INFO  | V.XACML.REQUEST] | PooledConnection                 | 64 - org.apache.activemq.activemq-osgi - 5.13.3 | ID-Ralfs-MacBook-Pro-local-59456-1464621134397-7-2 | failed to delete Temporary Queue "temp-queue://ID:Ralfs-MacBook-Pro.local-59467-1464621151437-1:2:1" on closing pooled connection: The connection is already closed
2016-05-30 17:12:51,943 | ERROR | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 | ID-Ralfs-MacBook-Pro-local-59456-1464621134397-7-2 | Could not refresh JMS Connection for destination 'temporary' - retrying in 5000 ms. Cause: null
[rest of component shutdown logs...]
2016-05-30 17:12:56,944 | ERROR | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 |  | Could not refresh JMS Connection for destination 'temporary' - retrying in 5000 ms. Cause: null
2016-05-30 17:13:01,948 | ERROR | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 |  | Could not refresh JMS Connection for destination 'temporary' - retrying in 5000 ms. Cause: null
2016-05-30 17:13:06,953 | ERROR | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 |  | Could not refresh JMS Connection for destination 'temporary' - retrying in 5000 ms. Cause: null
2016-05-30 17:13:11,956 | ERROR | V.XACML.REQUEST] | faultJmsMessageListenerContainer | 106 - org.apache.servicemix.bundles.spring-jms - 3.2.14.RELEASE_1 |  | Could not refresh JMS Connection for destination 'temporary' - retrying in 5000 ms. Cause: null
[...]
我必须如何设置上下文以支持包重新启动,并且仍然使用临时队列进行请求-应答消息传递

我当前的配置如下所示:

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${activemq.broker.url} />
    <property name="userName" value="${activemq.user}" />
    <property name="password" value="${activemq.password}" />
    <property name="useAsyncSend" value="true" />
</bean>

<bean id="pooledConnectionFactoryProducer" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
    <property name="maxConnections" value="${activemq.maxconnections}" />
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

<bean id="jmsConfigProducer" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactoryProducer" />
    <property name="deliveryPersistent" value="false" />
    <property name="replyToDeliveryPersistent" value="false" />
    <property name="transacted" value="false" />
</bean>

<bean id="amq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfigProducer" />
</bean>


我怀疑这会起作用。重新启动捆绑包意味着与临时队列的连接已断开,在最好的情况下,应该创建一个新的临时队列,而不是尝试连接一个不存在的临时队列。@SoucianceEqdamRashti,为什么这不起作用?我认为这只是一个在bundle停止/重新启动后正确清理的问题。如果我错了,请纠正我,但是如果您执行bundle重新启动,是否会丢失与临时队列的连接?奇怪的是,这种情况发生在activemq上,使用temp req/reply队列对rabbitmq执行bundle stop或restrat可以正常工作。@SoucianceEqdamRashti,是的,您当然会断开连接。AMQ将删除临时队列作为响应。因此,客户端不应该尝试重新连接到该队列,而是“简单地”放弃它,我想。也许您已经看过这里了?我怀疑这会起作用。重新启动捆绑包意味着与临时队列的连接已断开,在最好的情况下,应该创建一个新的临时队列,而不是尝试连接一个不存在的临时队列。@SoucianceEqdamRashti,为什么这不起作用?我认为这只是一个在bundle停止/重新启动后正确清理的问题。如果我错了,请纠正我,但是如果您执行bundle重新启动,是否会丢失与临时队列的连接?奇怪的是,这种情况发生在activemq上,使用temp req/reply队列对rabbitmq执行bundle stop或restrat可以正常工作。@SoucianceEqdamRashti,是的,您当然会断开连接。AMQ将删除临时队列作为响应。因此,客户端不应该尝试重新连接到该队列,而是“简单地”放弃它,我想。也许您已经看过这里了?