Die Verwendung des AsyncHttpClient
Providers mit Netty
verhindert, dass das Hauptprogramm beendet wird, wenn wir eine asynchrone Anfrage ausführen. Zum Beispiel endet das folgende Programm nach den println
oder nicht, je nachdem, ob der Anbieter JDKAsyncHttpProvider
oder NettyAsyncHttpProvider
:Wie wird AsyncHttpClient mit Netty für eine asynchrone HTTP-Anfrage geschlossen?
public class Program {
public static CompletableFuture<Response> getDataAsync(String uri) {
final AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
final CompletableFuture<Response> promise = new CompletableFuture<>();
asyncHttpClient
.prepareGet(uri)
.execute(new AsyncCompletionHandler<Response>(){
@Override
public Response onCompleted(Response resp) throws Exception {
promise.complete(resp);
asyncHttpClient.close(); // ??? Is this correct ????
return resp;
}
});
return promise;
}
public static void main(String [] args) throws Exception {
final String uri = "…";
System.out.println(getDataAsync(uri).get());
}
}
über die AsynHttpClient
In der Dokumentation:
AHC ist eine Abstraktionsschicht das kann über das bloße JDK, Netty und Grizzly hinausgehen. Beachten Sie, dass die JDK-Implementierung sehr begrenzt ist und Sie die anderen realen Anbieter WIRKLICH nutzen sollten.
Um AsyncHttpClient mit Netty zu verwenden, müssen wir nur die entsprechende Bibliothek in den Java-Klassenpfad einfügen. So haben wir die vorherigen Program
mit einer der folgenden Klassenpfad-Konfigurationen laufen kann Netty verwenden oder nicht:
-cp .;async-http-client-1.9.24.jar;netty-3.10.3.Final.jar;slf4j-api-1.7.12.jar
verwendenNettyAsyncHttpProvider
-cp .;async-http-client-1.9.24.jar;slf4j-api-1.7.12.jar
JDKAsyncHttpProvider
Was sonst noch verwenden sollten wir Möchten Sie Netty Provider richtig benutzen? Zum Beispiel schließe ich die AsyncHttpClient
in AsyncCompletionHandler
. Ist das korrekt?
Gibt es eine Konfiguration, um das beobachtete Verhalten zu ändern?
Ist das nicht 'AsyncHttpClient' Thread-sicher? Erstellen Sie keine neue Methode für jeden Methodenaufruf. –
Wenn Sie versuchen, den Client viel später zu schließen, z. nach 'thenAccept', würde Ihre Bewerbung enden? – ZhongYu
Nein. Das Schließen des asyncHttpClient oder nicht, hat keinen Einfluss auf das resultierende Verhalten. –