繁体   English   中英

如何在Java中调试无法解释的线程中断

[英]How to debug unexplained thread interruption in Java

我从Jenkins获得了InterruptedException ,这是堆栈跟踪的相关部分:

java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at hudson.remoting.Request.call(Request.java:127)
    at hudson.remoting.Channel.call(Channel.java:646)
    at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:158)
    at $Proxy33.join(Unknown Source)
    at hudson.Launcher$RemoteLauncher$ProcImpl.join(Launcher.java:861)

那个中断是出乎意料的,到目前为止还无法解释。 我实际上无法在调试器下实现这一点,它只发生在生产使用的CI中,而且很少发生,在Jenkins作业执行的1%以下。 到目前为止,梳理各种日志并没有产生任何有用的暗示。 远程Jenkins节点当时似乎没有断开连接。

问题:如何使用上述约束找出InterruptedException或其他任何可能有用的原因?

我们也欢迎任何其他追踪此类例外原因的想法! 也许Jenkins / Hudson特有的东西, 这个早期问题没有涵盖(答案在这里并没有真正帮助)。

InterruptedException看起来很正常。 检查Jenkins源代码我看到它被处理(它们关闭catch块中的资源)然后重新抛出。 开箱即用,我不明白为什么他们这样做(首先等待)。

在等待之前查看评论:

// I don't know exactly when this can happen, as pendingCalls are cleaned up by Channel,
// but in production I've observed that in rare occasion it can block forever, even after a channel
// is gone. So be defensive against that.
wait(30*1000);

我会说有人加入等待克服“永远阻挡的罕见场合”,并同时通过等待中断引入死亡。

您最好的选择是检查Jenkins问题跟踪器并提交一份报告,告知您的作业失败,因为等待会不时被中断并取消远程调用。 我认为如果他们想花费那么多时间等待或者继续但是在那一点上没有失败,他们应该回去等待。

不幸的是,它没有得到很好的强调,但等待条件的最佳方法是编写代码:

while(condition <> true){

 try { wait(1000L); //do something } catch (InterrruptedException e) { } 

}

你必须注意虚假的中断,并围绕这些中断编码。

暂无
暂无

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

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