2011-10-15 71 views
0

我們使用AMQ broker 5.5和Spring 3.0來配置連接工廠和其他東西。 我們正在使用的連接工廠是PooledConnectionFactory和我的配置的一部分,看起來像這樣:即使使用PooledConnectionFactory,JmsTemplate也不會關閉連接

<豆ID =「jmsFactory」級=「org.apache.activemq.pool.PooledConnectionFactory」消滅法=「止」 >

  <屬性名= 「connectionFactory的」 >

        < bean類= 「org.apache.activemq.ActiveMQConnectionFactory」 > <屬性名= 「brokerURL」 值= 「SOME_URL」/ >

        < /豆>

  < /屬性>

< /豆>

<! - Spring JMS模板 - >

<豆ID = 「JmsTemplate的」 類= 「org.springframework.jms.core.JmsTemplate」 >

    <屬性名= 「connectionFactory的」 > <裁判本地= 「jmsFactory」/ >

    < /屬性>

    <屬性名= 「explicitQosEnabled」 值= 「真」/ >

    <屬性名= 「傳輸TimeToLive」 值= 「86400000」/ >

< /豆腐

甲幾天後我們的經紀人崩潰,並保持重新啓動此錯誤:

java.lang.OutOfMemoryError:requested

用於Chunk :: new的369384字節。在交換空間之外?

在那個時間點,從JConsole的,我沒有發現什麼異常與經紀人,除了通過發送和傾聽每分鐘消息我們的客戶端應用程序 它與服務器談話(通過代理)的那一個創建了〜3000個連接(在jconsole上看到它)。一旦我們關閉它,一切都恢復正常。

所以,爲了避免這種情況,我嘗試在finally塊中關閉連接來做類似這樣的事情。

try { 

    connection = myJmsTemplate.getConnectionFactory().createConnection(); 

    session = connection.createSession(false, 1); 
    String messageSelector = "JMSCorrelationID='" + correlationId + "'"; 
    responseConsumer = session.createConsumer(receiveDestination, messageSelector); 
    LOG.info("Starting connection"); 
    connection.start(); 
    myJmsTemplate.send(sendDestination, new SimpleTextMessageCreator(
    message, receiveDestination, correlationId)); 
    LOG.info("Waiting for message with " + messageSelector + " for " + DEFAULT_TIMEOUT + " ms"); 
    TextMessage responseMessage = (TextMessage) responseConsumer.receive(DEFAULT_TIMEOUT); 
} 

catch (Someexception e) {do something} 
finally { 
    responseConsumer.close(); 
    session.close(); 
    connection.close(); 
} 

但即使如此,我可以看到連接漂浮在JConsole中,如果其公佈消息的客戶端應用程序被放倒只丟失。 有人可以幫助我瞭解這裏發生了什麼,以及在每個酒吧子週期後如何關閉連接。

謝謝你在前進,

哈日

回答

0

虛驚一場。還有一段代碼讓連接斷開。結束它解決了這個問題。

相關問題