Jms ActiveMQ如何处理关闭的会话

Jms ActiveMQ如何处理关闭的会话,jms,activemq,Jms,Activemq,我使用ActiveMQ将电子邮件消息排队,消费者读取队列并发送电子邮件 在启动时,我注册一个生产者并将其永久缓存 PooledConnectionFactory factory = new PooledConnectionFactory(new ActiveMQConnectionFactory(jmsBrokerUserName, jmsBrokerPassword, activeMQBrokerURL)); Connection connection = factory.createConn

我使用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]

有人能告诉我什么是处理非公开会议的最佳方式吗?我应该重新注册我的制作人吗?或者有办法重新打开会话吗?

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


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

那么连接呢?可以缓存连接对象吗?或者因为它是PooledConnectionFactory,所以每次生成消息时都可以调用createConnection吗?jms连接对象可以缓存并在任何线程上使用,但正如您所说,它将是连接池的一部分,因此如果您每次调用createConnection,应该没有实际成本。