我們使用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中,如果其公佈消息的客戶端應用程序被放倒只丟失。 有人可以幫助我瞭解這裏發生了什麼,以及在每個酒吧子週期後如何關閉連接。
謝謝你在前進,
哈日