2016-08-01 3 views
0

Труба открыта nio. Я обнаружил, что конечная точка записи закрыта, но конечная точка чтения открыта. Я проверил свой код, два конечных точки всегда закрываются вместе. Итак, есть ли возможность закрыть трубку без вызова close?труба закрыта без разговора закрыта

пс. Код является исходным кодом zero ice. Я нашел проблему в производственной среде. Путь кода IceInternal.Selector, труба _fdIntrRead и _fdIntrWrite. Моя ice версия 3.3.1.

У меня есть ответ. NIO будет закрывать канал, когда текущий поток прерывается. Это ошибка ice, которая была исправлена ​​в версии 3.6.

+0

Скорее всего, вы его где-то закрыли. Я предлагаю записать, где вы закрываете канал как сообщение журнала. –

+1

@PeterLawrey. Переменная является частной. Поэтому он должен быть закрыт в одном файле. – phyxnj

+0

Вы используете try-with-resouces? 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/AutoCloseable.html –

+0

@JohnnyV Конечно, но это приложение делает это, а не NIO. – EJP

Смежные вопросы