tangguo

ActiveMQ和CachingConnectionFactory的自动重新连接问题

java

我在使用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可能做得不好(是否在缓存与旧服务器通信的生产者?)。

我在这里想念我需要做的事情吗?我的设置似乎很正常,但找不到其他人遇到此问题。


阅读 589

收藏
2020-10-19

共1个答案

小编典典

我遇到的问题是ActiveMQ并未告知CachingConnectionFactory重新连接的时间,因此仍在使用缓存的连接。我用ActiveMQ代替了它,PooledConnectionFactory问题就消失了。

2020-10-19