2016-08-01 45 views
0

Das Rohr wird von nio geöffnet. Ich fand den Schreib-Endpunkt geschlossen, aber den Lese-Endpunkt geöffnet. Ich habe meinen Code überprüft, zwei Endpunkte sind immer zusammen geschlossen. Also, gibt es eine Möglichkeit, dass die Leitung ohne Anruf close Funktion von mir selbst geschlossen werden?Rohr geschlossen ohne Ruf schließen

ps. Der Code ist der Quellcode von zero ice. Ich habe das Problem in der Produktionsumgebung gefunden. Der Codepfad ist IceInternal.Selector, die Pipe ist _fdIntrRead und _fdIntrWrite. Meine ice Version ist 3.3.1.

Ich habe die Antwort bekommen. NIO schließt Kanal, wenn der aktuelle Thread unterbrochen ist. Es ist ein Fehler von ice, der in Version 3.6 behoben wurde.

+0

Wahrscheinlich haben Sie es irgendwo geschlossen. Ich empfehle Aufnahme, wo Sie ein Rohr als eine Protokollnachricht für jetzt schließen. –

+1

@PeterLawrey. Die Variable ist privat. Also muss es in der einzigen Datei geschlossen sein. – phyxnj

+0

Verwenden Sie Test-mit-Ressourcen? https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html Das könnte erklären, warum es automatisch schließt. –

Antwort

0

Wahrscheinlich haben Sie es irgendwo geschlossen. Ich bin oft davon überzeugt, dass ich in solchen Fällen keine Ressource geschlossen habe, aber nachdem ich das Problem diagnostiziert habe, stellt sich heraus, dass ich es getan habe.

Ich empfehle Aufnahme wo (einschließlich eines Stack-Trace) Sie eine Pipe als Log-Nachricht für jetzt schließen. z.B.

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

Also, gibt es eine Möglichkeit, dass das Rohr ohne Aufruf schließt Funktion von mir geschlossen werden?

NIO schließt die Dinge nicht, es sei denn, Sie haben eine ClosedByInterruptException. Nur die Anwendung kann das tun.

+0

Es ist möglich, dass AutoCloseable ins Spiel kommt. https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html –

+0

@JohnnyV Natürlich, aber das ist die Anwendung, die das tun, nicht NIO. – EJP