ActiveMQ和CachingConnectionFactory的自动连接问题

时间:2011-05-06 20:26:16

标签: java spring activemq

我遇到了ActiveMQ和Spring CachingConnectionFactory的问题。我把它们设置成这样:

<!-- A connection to ActiveMQ --> 
<bean id="myConnectionFactory" 
    class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${jms.url}"/>
    <property name="userName" value="${jms.username}"/>
    <property name="password" value="${jms.password}"/>
</bean>

<!-- A cached connection to wrap the ActiveMQ connection --> 
<bean id="myCachedConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="myConnectionFactory"/>
    <property name="sessionCacheSize" value="10"/>
    <property name="reconnectOnException" value="true"/>
</bean>

<!-- A destination in ActiveMQ --> 
<bean id="myDestination" 
    class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="${jms.queue}" />
</bean>

<!-- A JmsTemplate instance that uses the cached connection and destination --> 
<bean id="myProducerTemplate" 
    class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="myCachedConnectionFactory"/>
    <property name="defaultDestination" ref="myDestination"/>
</bean>

jms.url正在使用故障转移传输:

failover:(tcp://firstbox:6166,tcp://secondbox:6166)?timeout=3000

我遇到的问题是,如果一个盒子出现故障,我们应该开始在另一个盒子上发送消息,但它似乎仍在使用旧连接(每次发送超时)。如果我重新启动程序,它将再次连接,一切正常。

我的理解是ActiveMQConnectionFactory应该自行修复(重新连接到新框),JmsTemplate每次都应该请求新连接,这样就可以了。我想知道CachingConnectionFactory是否可能做坏事(缓存与旧服务器通信的制作人?)。

我错过了我需要做的事吗?我的设置似乎很正常,但我找不到其他人遇到这个问题。

2 个答案:

答案 0 :(得分:5)

我遇到的问题是ActiveMQ在重新连接时没有告诉CachingConnectionFactory,因此缓存的连接仍在使用中。我用ActiveMQ的PooledConnectionFactory替换了它,问题就消失了。

答案 1 :(得分:4)

仅供参考,我刚刚测试了两个本地AMQ代理之间的这种情况(使用CachingConnectionFactory进行生产者/消费者连接),故障转移工作正常......

据说...当使用轮询消费者模式时,我看到其他消费者连接问题......必须手动关闭连接或其他东西。