2014-06-30 99 views
2

我正在使用ActiveMQ排隊電子郵件,消費者讀取隊列併發送電子郵件。ActiveMQ如何處理關閉的會話

在啓動時,我註冊一個生產者並永久地緩存它。

PooledConnectionFactory factory = new PooledConnectionFactory(new ActiveMQConnectionFactory(jmsBrokerUserName, jmsBrokerPassword, activeMQBrokerURL)); 
Connection connection = factory.createConnection(); 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
Destination destination = session.createQueue(queueName); 
MessageProducer producer = session.createProducer(destination); 

隨着連接關閉,生產者不時排隊消息。

Caused by: javax.jms.IllegalStateException: The Session is closed 
    at org.apache.activemq.ActiveMQSession.checkClosed(ActiveMQSession.java:767) ~[activemq-client-5.10.0.jar:5.10.0] 
    at org.apache.activemq.ActiveMQSession.configureMessage(ActiveMQSession.java:755) ~[activemq-client-5.10.0.jar:5.10.0] 
    at org.apache.activemq.ActiveMQSession.createTextMessage(ActiveMQSession.java:438) ~[activemq-client-5.10.0.jar:5.10.0] 
    at org.apache.activemq.jms.pool.PooledSession.createTextMessage(PooledSession.java:242) ~[activemq-jms-pool-5.10.0.jar:5.10.0] 

有人請讓我知道什麼是處理閉合會議的最佳方式?我應該重新註冊我的製片人嗎?或者有沒有辦法重開會議?

回答

3

當使用JMS時,您不應該真正緩存JMS會話(以及任何懸置的內容,如生產者)。原因在於JMS會話是JMS中的工作單元,所以應該是短暫的對象。在Java EE環境中,例如JMS會話也可能以全局事務方式入伍,因此需要正確確定範圍。

的JMS會話實例不能被多個線程同時使用,所以最好的建議是,你正在使用的每個線程上創建JMS Session和關閉JMS會話時,你已完成單位工作的(發送一條消息或一筆交易中的消息)

+0

而連接呢?連接對象可以被緩存嗎?或者從它的PooledConnectionFactory開始,每次產生消息時都可以調用create connection。 –

+0

jms連接對象可以在任何線程上被緩存和使用,但是正如你所說,它將成爲連接池的一部分,所以如果每次調用createConnection都不應該有實際成本。 – whitfiea