Ich möchte benachrichtigt werden, wenn ein SocketChannel
hat seine close
Methode genannt. Mein erster Gedanke war, einen Wrapper zu erstellen, der einen Listener benachrichtigt, wenn die Methode implCloseSelectableChannel
aufgerufen wird (da die close
-Methode selbst als final
in AbstractInterruptibleChannel
deklariert ist). Diese Lösung funktioniert, aber als ich versuchte, sie mit einem Selector
zu registrieren, würde ich wegen der folgenden Überprüfung in IllegalSelectorException
:% /% ein SelectorImpl
bekommen
%Vor%
Jetzt kann ich die register
-Methode nicht überschreiben, um sie an die eingebundene SocketChannel
zu delegieren, weil final
in AbstractSelectableChannel
deklariert ist und ich SelChImpl
nicht implementieren kann, weil sie standardmäßig in% co_de sichtbar ist % Paket. Der einzige Weg, den ich von hier aus sehen könnte, wäre, mein eigenes sun.nio.ch
und SelectorProvider
zu machen, aber das scheint für etwas so einfaches Overkill zu sein.
Gibt es einen einfacheren Weg, benachrichtigt zu werden, wenn ein Selector
geschlossen wurde oder muss ich meinen Programmentwurf überdenken?
SocketChannel
Beispiel:
Wenn das SocketChannel
von Ihnen geschlossen wird, schließen Sie es, damit Sie sich selbst so benachrichtigen können, wie Sie möchten.
Wenn Sie benachrichtigt werden möchten, wenn der Partner die Verbindung schließt, , wird OP_READ
ausgelöst, und ein Lesevorgang gibt -1 zurück.
das ist böse. Sie könnten vielleicht ein Byte-Level-AOP-Paket wie
Sie könnten auch ein Paket mit dem gleichen Namen wie das sun-Paket erstellen und die Schnittstelle dort implementieren.
aber ich kann keinen guten, sauberen Weg sehen, dies zu tun.