2016-08-01 26 views
0

パイプはnioで開かれています。書き込みエンドポイントが閉じていたが、読み取りエンドポイントが開いていた。私は自分のコードをチェックし、2つの終点は常に閉じています。ですから、私自身closeの機能がなくてもパイプが閉じられる可能性はありますか?パイプを閉じずに閉じる

ps。コードはzero iceのソースコードです。私は本番環境でこの問題を発見しました。コードパスはIceInternal.Selector、パイプは_fdIntrReadおよび_fdIntrWriteです。私のiceバージョンは3.3.1です。

私は答えを得た。 NIOは、現在のスレッドが中断されたときにチャネルを閉じます。バージョン3.6で修正されたiceのバグです。

+0

おそらくあなたはどこかでそれを閉じました。今はログメッセージとしてパイプを閉じる場所を記録することをお勧めします。 @PeterLawrey。 –

+1

変数はprivateです。だから、それは単一のファイルで閉じなければなりません。 – 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が有効になる可能性があります。 –

+0

@JohnnyVもちろん、それはアプリケーションであり、NIOではありません。 – EJP

関連する問題