java—异常发生后,如何从系统中正确关闭和清除jms连接、会话、使用者和生产者?

toiithl6  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(354)

我们使用apacheqpid jms客户机(0.45)来使用来自servicebus的消息。在重新启动连接时,我们发现可疑的死锁线程。经过日志调查,我们发现jmssession没有正确关闭。关闭jmssession时-收到来自messagelistener回调错误的非法调用。这可能是线程阻塞的原因。
如果我们在关闭jms连接/会话/使用者时收到异常,那么我们如何从系统中正确地关闭和清理?
我在关闭后重置jms对象,例如 Connection = null, MessageConsumer=null; Session = null; . 我认为这是不能正常工作,因为一些线程仍然在系统中打开。
有没有人能建议从系统中正确地清除和关闭jms对象?
死锁日志示例
可疑的死锁线程:jmssession[id:7086e194-aaec-4b41-cde1-fd680526e07a:1:12]delivery dispatcher id=201正在等待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 |“

m528fe3b

m528fe3b1#

根据jms规范,调用connection.close()将关闭所有客户端资源,并在关闭完成后关闭所有客户端线程。不需要关闭每个单独的资源,除非您正在尝试重新创建失败的使用者或生产者,但最终很难从一般的jms异常中分辨出发生了什么错误,因此您可能最终会关闭连接并重新开始,成为最可靠的错误恢复方法。
您使用的是一个相当旧的jms客户机版本,最新版本是0.55.0,0.56.0可能在一两周内发布。在您现在的位置和当前可用的位置之间有许多修复,因此您确实应该在追求可能修复的东西之前进行更新。

相关问题