2011-05-06 47 views
5

我遇到ActiveMQ和Spring的CachingConnectionFactory問題。我將它們設置是這樣的:ActiveMQ和CachingConnectionFactory的Autoreconnect問題

<!-- 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是否可能做壞事(緩存與舊服務器對話的製作人?)。

我是否錯過了我需要做的事情?我的設置看起來很正常,但我找不到任何其他人有這個問題。

回答

5

我遇到的問題是ActiveMQ在重新連接時沒有告訴CachingConnectionFactory,所以緩存的連接仍在使用中。我用ActiveMQ的PooledConnectionFactory替換它,問題就消失了。

3

僅供參考,我只是測試這種情況下(使用CachingConnectionFactory兩個生產者/消費者連接)兩個本地AMQ經紀人和故障切換之間工作得很好......

這樣說......我看到其他消費者使用輪詢消費者模式時出現連接問題......必須手動關閉連接或其他內容。