管道由nio
打开。我发现写端点已关闭但读端点已打开。我检查了我的代码,两个端点总是一起关闭。那么,是否有可能在没有自己调用close
函数的情况下关闭管道?
PS。代码是zero ice
的源代码。我在生产环境中发现了这个问题。代码路径为IceInternal.Selector
,管道为_fdIntrRead
和_fdIntrWrite
。我的ice
版本为3.3.1
。
我得到了答案。当前线程被中断时,NIO
将关闭通道。这是ice
的错误,已在版本3.6
中修复。
答案 0 :(得分:0)
你最有可能在某处关闭它。我常常确信在这样的情况下我没有关闭资源但是在诊断出问题之后我发现了。
我建议现在记录关闭管道的位置(包括堆栈跟踪)作为日志消息。 e.g。
new Throwable(pipe + " closed here").printStackTrace();
pipe.close();
答案 1 :(得分:0)
除非你得到那么,管道是否有可能在没有我自己的关闭功能的情况下关闭?
ClosedByInterruptException
,否则NIO不会关闭事情。只有应用程序可以做到这一点。