我使用 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]
有人可以让我知道处理封闭式 session 的最佳方法是什么吗?我应该重新注册我的生产者吗?或者有没有办法重新打开 session ?
最佳答案
使用 JMS 时,您不应该真正缓存 JMS session (以及任何挂起的东西,例如生产者)。原因是 JMS Session 是 JMS 中的工作单元,因此应该是一个短暂的对象。例如,在 Java EE 世界中,JMS Session 也可能与全局事务一起登记,因此需要正确设置范围。
JMS Session 实例不能被多个线程同时使用,因此最好的建议是在您正在使用的每个线程上创建 JMS Session 并在完成该工作单元(发送消息或交易中的消息)
关于jms - ActiveMQ 如何处理关闭的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24494255/