繁体   English   中英

发生异常后,我们如何从系统中正确关闭和清理 JMS 连接、Session、消费者和生产者?

[英]How can we close and clean properly JMS Connection, Session, Consumer and Producer from system after Exception?

我们正在使用 Apache Qpid JMS Client(0.45) 来使用来自 ServiceBus 的消息。 重新启动连接时,我们收到了可疑的死锁线程 经过日志调查,我们发现 JmsSession 没有正常关闭。 关闭 JmsSession 时 - 我们收到来自 MessageListener 回调错误的非法调用 这可能是线程阻塞的原因。

如果我们在关闭 JMS Connection/Session/Consumer 时收到异常,那么我们如何才能从系统中正确关闭和清理呢?

我在关闭后重置 JMS object 例如Connection = null, MessageConsumer=null; Session = null; Connection = null, MessageConsumer=null; Session = null; . 我认为这不能正常工作,因为某些线程仍然在 System.

谁能建议任何想法从系统中正确清理和关闭 JMS object?

示例死锁日志

疑似死锁线程:JmsSession [ID:7086e194-aaec-4b41-cde1-fd680526e07a:1:12] Delivery Dispatcher Id=201 is in WAITING on lock=java.util.concurrent.locks.ReentrantLock$NonfairSync@20af281a
归 JmsSession 所有 [ID:7086e194-aaec-4b41-cde1-fd680526e07a:1:10] 交付调度程序 Id=199 | JmsSession [ID:7086e194-aaec-4b41-cde1-fd680526e07a:1:10] 交付调度程序 Id=199 在 lock=org.mule.transport.Servicebus@778245e1 上处于阻塞状态
归 JmsSession [ID:7086e194-aaec-4b41-cde1-fd680526e07a:1:12] 交付调度程序 Id=201 | 所有 "

根据 JMS 规范,调用 Connection.close() 将关闭所有客户端资源并在关闭完成后关闭所有客户端线程。 除非您正在尝试重新创建失败的消费者或生产者,否则无需关闭每个单独的资源,但最终很难从通用 JMS 异常中判断出了什么问题,因此您可能最终会关闭连接和重新开始是最可靠的错误恢复方式。

您使用的是相当旧的 JMS 客户端版本,因为最新版本是 0.55.0,而 0.56.0 可能会在一两周内发布。 在您现在所在的位置和当前可用的位置之间有许多修复,因此您真的应该在追逐可能修复的东西之前进行更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM