2012-12-30 15 views
6

Ich schreibe einen Server mit Java NIO, und ich habe ein paar Fragen, auf die ich keine Antworten finden kann.Java NIO und SSL

Erstens, in Bezug auf SSLEngine, wie NEED_TASK richtig in getrennten Thread behandelt werden? Wenn ich Aufgaben in einem separaten Thread aufrufe, werden sie abgeschlossen, aber ich habe keine Ahnung, wie ich zu einer anderen Handshake-Operation zurückkehren soll. Eine Option wäre, diese Operation von einem Thread aufzurufen, der eine delegierte Aufgabe ausgeführt hat, aber ich denke, das ist nicht der richtige Weg.

Eine andere Frage ist über interestOps() aus anderen Thread dann Selektor Thread aufrufen. Ich muss Schlüsselinteressen ändern, nachdem ein Versuch, auf Kanal zu schreiben, nicht alle Daten geschrieben hatte. Ich dachte über eine Art Queue von Änderungen wie in ROX NIO Tutorial, aber ich habe in einem anderen Thread hier gelesen, dass es nicht der beste Weg ist.

+1

Um Wähler zu schließen: das ist in der Tat eine echte Frage, auch wenn Sie es persönlich nicht verstehen. – EJP

Antwort

3

zuerst in Bezug auf SSLEngine, wie NEED_TASK ordnungsgemäß in getrennten Thread behandelt werden. Wenn ich Aufgaben in einem separaten Thread aufrufe, werden sie vervollständigt, aber ich habe keine Ahnung, wie ich zu anderen Handshake-Operationen zurückkehren soll.

Während der Motor im Zustand NEED_TASK ist, kann er nichts anderes tun. Wenn die Aufgabe abgeschlossen ist, sollten Sie die Operation, die ursprünglich NEED_TASK zurückgegeben hat, wiederholen und sich von der Engine informieren lassen, was als nächstes zu tun ist. Sie müssen die Verwendung dieser Engine durch andere Threads blockieren oder deaktivieren, bis die Task abgeschlossen ist, d. H. Sie wählen nicht auf diesem Kanal aus.

Eine andere Frage ist über den Aufruf von interestOps() aus verschiedenen Thread dann Selektor-Thread. Ich muss Schlüsselinteressen ändern, nachdem ein Versuch, auf Kanal zu schreiben, nicht alle Daten geschrieben hatte. Ich dachte darüber nach, eine Art Queue von Änderungen wie im ROX NIO Tutorial zu verwenden, aber ich habe in einem anderen Thread gelesen, dass es nicht der beste Weg ist.

Das wäre ich gewesen. Ich hasse diese Schlangen. Ich wecke nur() den Selektor und ändere die interestOps, habe damit noch nie ein Problem gesehen. Der Selektor-Thread muss korrekt mit Null-Keys fertig sein, aber das muss er schon tun.

+0

Ich bin auch an dieser Lösung interessiert. Jedes Arbeitsbeispiel? –

+0

Ich bin mir nicht sicher, auf welche dieser beiden Lösungen Sie verweisen, aber ich habe eine vollständige, kommerziell verfügbare Implementierung eines SSLSocketChannel/SSLSelector/SSLServerSocketChannel-Produkts, das die SSLE-Engine intern verwendet und als SelectorProvider gepackt ist. Details auf Anfrage. – EJP

+0

Die zweite Antwort ist klar, und das werde ich tun. Über die ersten habe ich noch einige Zweifel. Ich muss die letzte Operation, die NEED_TASK aufgerufen hat, wieder aufnehmen, aber ich weiß nicht, wie ich das machen soll. Das Einzige, was ich mir vorstellen kann, ist die Wiederaufnahme von Thread, der die Aufgabe abgeschlossen hat, aber das würde die Ausführung von Lese-/Schreiboperationen verschieben Auswahlfaden. Könnten Sie mir vielleicht einen Hinweis geben, wie ich vorgehen soll – user1418979