ActiveMQ和CachingConnectionFactory的自动重连问题

7

我在使用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个回答

7
我遇到的问题是,ActiveMQ没有通知重新连接,因此仍在使用缓存的连接。我将其替换为ActiveMQ的,问题解决了。

4

请注意,我刚刚测试了这个场景(使用CachingConnectionFactory作为生产者/消费者连接)在两个本地AMQ代理之间进行,故障转移正常工作...

话虽如此...当使用轮询消费者模式时,我发现其他消费者连接存在问题...可能需要手动关闭连接或执行其他操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接