Ich arbeite an dem Beispiel Netty HTTP-Client-Code , um HTTP-Anfragen in einer parallelen Umgebung mit Threads zu erstellen.
Allerdings bricht mein System bei einigen wenigen Ausnahmen vollständig ab.
In fast Pseudocode:
%Vor%Im Beispiel, um eine Anfrage zu machen, erstelle ich einen ClientBootstrap, und von dort (durch ein paar Reifen) einen Kanal, um den HTTPRequest zu schreiben.
Das alles funktioniert und ist gut.
Sollte jedoch in einer gleichzeitigen Situation jede Anfrage die gleichen Reifen durchlaufen? Ich denke, das ist es, was im Moment für mich bricht. Soll ich die Verbindung wiederverwenden oder meinen Klienten ganz anders strukturieren?
Auch: Ich mache das in Clojure, wenn das überhaupt einen Unterschied macht.
Nein, du machst die Dinge richtig. Sie müssen jedoch einen Verweis auf Ihre Channel
-Instanz beibehalten. Sobald Sie diesen Kanal haben, müssen Sie, solange er geöffnet ist, keinen weiteren Bootstrap erstellen. (Wenn Sie das tun.)
Das habe ich in einem aktuellen Projekt verwendet:
Klasse ClientConnection (Konstruktor)
%Vor%Klasse ClientConnection.connect (String-Host, int-Port)
%Vor% Also, im Grunde behalte ich nur einen Verweis auf bootstrap
und channel
, jedoch wird ersteres außerhalb dieser Codezeilen nicht verwendet.
Hinweis: Sie sollten bootstrap.releaseExternalResources();
nur einmal ausführen, wenn die Anwendung beendet wird. In meinem Fall sendet der Client einige Dateien, schließt dann den Kanal und beendet ihn.
Sobald Sie eine verbundene Instanz Channel
haben, müssen Sie diese nur verwenden, bis Sie sie wieder schließen. Sobald es geschlossen ist, können Sie bootstrap
aufrufen, um erneut ein neues Channel
zu erstellen.
Ich persönlich finde Netty am Anfang etwas schwer zu verstehen, aber sobald Sie begreifen, wie es funktioniert, ist es einfach das beste NIO-Framework in Java. IMO.
Tags und Links java clojure http concurrency netty