我正在使用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]
有人可以告诉我处理非公开会议的最佳方法是什么?我应该重新注册我的制片人吗?或者有没有办法重新开会?
答案 0 :(得分:3)
使用JMS时,您不应该真正缓存JMS会话(以及诸如Producer之类的任何内容)。原因是JMS会话是JMS中的工作单元,因此应该是一个短期对象。例如,在Java EE世界中,JMS会话也可能与全局事务一起登记,因此需要正确确定范围。
JMS Session实例不能由多个线程同时使用,因此最好的建议是在您正在使用的每个线程上创建JMS会话,并在完成工作单元后关闭jms会话(在交易中发送消息或消息集合)