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