ActiveMQ如何处理已关闭的会话

时间:2014-06-30 15:57:25

标签: jms 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]

有人可以告诉我处理非公开会议的最佳方法是什么?我应该重新注册我的制片人吗?或者有没有办法重新开会?

1 个答案:

答案 0 :(得分:3)

使用JMS时,您不应该真正缓存JMS会话(以及诸如Producer之类的任何内容)。原因是JMS会话是JMS中的工作单元,因此应该是一个短期对象。例如,在Java EE世界中,JMS会话也可能与全局事务一起登记,因此需要正确确定范围。

JMS Session实例不能由多个线程同时使用,因此最好的建议是在您正在使用的每个线程上创建JMS会话,并在完成工作单元后关闭jms会话(在交易中发送消息或消息集合)