2013-02-12 34 views
0

我越來越從詹金斯,堆棧跟蹤的相關部分的InterruptedException如何調試不明原因的線索中斷在Java中

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所特有的,不包括在this earlier question(這裏的答案在這裏並不真正有幫助)。

+0

當您等待條件成立時,您應該調用Object :: wait。如果你被打斷了,情況仍然是錯誤的,那就是一種虛假的喚醒。回到等待模式。 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait%28%29 – 2013-02-12 08:40:33

+0

@RKajaMohideen是的,除了它不是我的等待,所以看起來像是bug報告時間。 – hyde 2013-02-12 09:59:58

+0

是的。如果圖書館等待一些目的。它必須預見到這種情況會被打斷,並且應該處理要麼再次等待,要麼失敗,而不是向客戶拋出異常。 – 2013-02-12 10:11:43

回答

2

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問題跟蹤器,並提交一份報告,指出您的工作失敗,因爲等待會不時中斷,並取消遠程調用。我想他們應該回到等待,如果他們想花這麼多時間等待或繼續,但不會在這一點上失敗。

0

不幸的是,它也沒有很好的強調,而是等待一個條件最好的辦法是通過編寫代碼,例如:

而(條件<>真){

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

}

你必須警惕虛假的中斷和代碼。

+0

什麼是「虛假中斷」?我聽說過(依賴於平臺)虛假喚醒,但從來沒有聽說過虛假中斷。反過來,共識是你至少應該設置中斷標誌(通過調用Thread.currentThread()。interrupt())來捕獲一個InterruptedException,並且在任何情況下都不應該按照你的方式吞下它提議。 – laszlok 2017-08-30 15:03:09