我在使用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可能做得不好(是否在缓存与旧服务器通信的生产者?)。
ActiveMQConnectionFactory
我在这里想念我需要做的事情吗?我的设置似乎很正常,但找不到其他人遇到此问题。
我遇到的问题是ActiveMQ并未告知CachingConnectionFactory重新连接的时间,因此仍在使用缓存的连接。我用ActiveMQ代替了它,PooledConnectionFactory问题就消失了。
CachingConnectionFactory
PooledConnectionFactory