【问题标题】:ActiveMQ How to handle closed sessionActiveMQ 如何处理关闭的会话
【发布时间】:2014-08-21 01:38:28
【问题描述】:

我正在使用 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 activemq


    【解决方案1】:

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

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

    【讨论】:

    • 那么连接呢?可以缓存连接对象吗?或者因为它是一个 PooledConnectionFactory,所以每次我必须产生一条消息时都可以调用 create connection 吗?
    • jms 连接对象可以被缓存并在任何线程上使用,但正如您所说,它将成为连接池的一部分,因此如果您每次调用 createConnection 应该没有实际成本。
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2019-08-20
    • 2016-05-19
    相关资源
    最近更新 更多