2016-08-01 166 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