ActiveMQ 如何处理关闭的会话

Sun*_*wal 8 activemq-classic jms

我使用 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);
Run Code Online (Sandbox Code Playgroud)

有时,当连接关闭时,生产者无法将消息加入队列。

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]
Run Code Online (Sandbox Code Playgroud)

有人可以让我知道处理封闭式会议的最佳方法是什么吗?我应该重新注册我的生产者吗?或者有没有办法重新打开会话?

小智 7

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

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