2016-08-01 217 views
0

管道打開nio。我發現寫入端點關閉,但讀取端點打開。我檢查了我的代碼,兩個端點總是一起關閉。那麼,有沒有可能自行關閉管道而不要求close功能?管道關閉不需要關閉

ps。該代碼是zero ice的源代碼。我在生產環境中發現了這個問題。代碼路徑爲IceInternal.Selector,管道爲_fdIntrRead_fdIntrWrite。我的ice版本是3.3.1

我得到了答案。當前線程中斷時,NIO將關閉通道。這是一個ice的bug,它在3.6版本中修復。

+0

最有可能你在某個地方關閉了它。我建議現在記錄關閉管道作爲日誌消息的位置。 –

+1

@PeterLawrey。該變量是私人的。所以它必須在單個文件中關閉。 – phyxnj

+0

你使用試用資源嗎? https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html這可以解釋爲什麼它會自動關閉。 –

回答

0

很可能你確實在某處關閉了它。我經常相信,在這樣的情況下,我還沒有關閉資源,但在診斷出問題後我發現了這個問題。

我建議記錄你現在在哪裏(包括堆棧跟蹤)關閉管道作爲日誌消息。例如

new Throwable(pipe + " closed here").printStackTrace(); 
pipe.close(); 
0

那麼,有沒有一種可能性,即管人呆着不調用關閉功能關閉?

NIO不關閉東西,除非你得到ClosedByInterruptException。只有應用程序可以做到這一點。

+0

AutoCloseable可能會發揮作用。 https://docs.oracle.com/javase/8/docs/api/java/lang/Au​​toCloseable.html –

+0

@JohnnyV當然,但這是應用程序,而不是NIO。 – EJP