当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ如何处理关闭的会话

唐繁
2023-03-14

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

有人能告诉我处理闭门会议的最佳方式吗?我应该重新注册我的制作人吗?还是有办法重开会话?

共有1个答案

从建明
2023-03-14

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

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

 类似资料:
  • 我有两个运行在不同机器上的ActiveMQ Artemis代理,组成一个简单的集群。我正在使用一个Java应用程序(非常基本)来生成和使用消息,以分析集群的行为。Java代码如下所示: 同时在处使用断点调试上述应用程序。如果我停止我的主代理,那么我会看到从代理接管,所有的消息都像预期的那样被移动到从代理。但是,此时,如果我继续使用我的应用程序,它将抛出,而不是在从代理中使用消息。当我再次启动主代理

  • 问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可

  • 我们如何优雅地关闭守护进程线程[ActiveMQ会话:ID:PC-63704-1472105244157-1:1:1]? spring-boot activeMQ设置如下所示 对于发送消息,我们只是简单地autowired JmsTemplate并发送消息出去: 对于接收(监听)消息,我们使用Spring DefaultMessageListenerContainer(DMLC) 我们还有其他的设

  • 问题内容: 遵循我们在如何在MySQL中关闭sqlalchemy连接中的注释之后,我正在检查SQLAlchemy创建到数据库中的连接,如果不退出Python,我将无法关闭它们。 如果我在python控制台中运行此代码,它将保持会话打开状态,直到我退出python为止: 我发现要关闭它的唯一解决方法是在最后调用。 根据我上面给出的链接中的评论,我的问题现在是: 为什么需要关闭会议? 还不够吗 问题答

  • < b >想改进这个问题?通过编辑此帖子更新问题,使其只关注一个问题。 我正在开发一个原生android应用程序,没有错误,但Logcat说 android-Studio指向的警告线:- 当您的应用程序无法与 LAN 上的本地服务器通信时,会出现此问题。 有人能建议我如何有效地处理这种例外情况吗?只是希望我的应用程序没有错误和警告。 也许我们可以使用<code>try-catch</code>?至