Ich bin neu zu nett und kämpfe immer noch darum, meinen Weg zu finden. Ich suche einen http-Client, der asynchron arbeitet. Die Nettobeispiele von http zeigen nur, wie man auf IO-Operationen wartet, und nicht, wie man addListener verwendet, und deshalb habe ich versucht, dies in den letzten paar Tagen herauszufinden.
Ich versuche, eine Anfrageklasse zu erstellen, die alle verschiedenen Zustände einer Anfrage behandelt, von der Verbindung, dem Senden der Daten, der Verarbeitung der Antwort und dem anschließenden Schließen der Verbindung. Um dies zu tun, erweitert meine Klasse SimpleChannelUpstreamHandler und implementiert ChannelFutureListener . Ich benutze eine ChannelPipelineFactory , die die (diese) Instanz der Klasse (als SimpleChannelUpstreamHandler ) der Pipeline als Handler hinzufügt.
Die Verbindung wird wie folgt erstellt:
%Vor%Dann die Methode operationComplete :
%Vor%Die Klasse überschreibt auch die Methode messageReceived :
%Vor%Das Problem ist, dass ich diese Ausgabe bekomme:
%Vor%Wie Sie sehen können, wird das messageReceived von dem aus irgendeinem Grund nicht ausgeführt, obwohl die Pipeline-Factory die Instanz dieser Klasse zur Pipeline hinzufügt.
Irgendwelche Ideen, was mir hier fehlt? Danke.
Ich habe es endlich geschafft, dank der Hilfe von @JestanNirojan das funktionieren zu lassen, falls sich jemand für die Lösung interessieren sollte:
%Vor%Sie verwenden einen ChannelFutureListener, um alle Operationen im Kanal auszuführen (was schlecht ist), und der zukünftige Listener wird direkt nach dem Aufruf dieser Kanaloperationen ausgeführt.
Das Problem besteht darin, dass nach dem Senden der Nachricht der Kanal sofort getrennt wird und der Handler die Antwortnachricht, die später kommt, nicht empfangen kann.
%Vor%Sie sollten den Channel-Zukunfts-Thread überhaupt nicht blockieren. Der beste Ansatz ist die Erweiterung des SimpleChannelUpstreamHandler
%Vor%Methoden und reagieren auf diese Ereignisse. Sie können den Status auch in diesem Handler behalten.
Tags und Links java http asynchronous netty nio