jms - ActiveMQ 如何处理关闭的 session

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

有人可以让我知道处理封闭式 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/

相关文章:

jms - ActiveMQ、Apollo、Kafka

storage - ActiveMQ 最适合使用哪种消息存储?

java - 如何将war文件部署者的第三方类加载到tomcat中

python - 在 Grails 应用程序后面使用 Python 或 C

rabbitmq - 寻找正确的 mule 组件以按 fifo 顺序解复用消息

java - Spring JMS ActiveMQ 跟踪作业状态

java - 这是分布式机制的现实期望吗?

java - 从死信队列恢复

java - 持久订阅能否在客户端重启后继续存在?

tomcat - Jboss vs tomcat(清除 java ee 支持的阴影)