Korzystanie z dostawcy AsyncHttpClient
z Netty
uniemożliwi zakończenie programu głównego po wykonaniu żądania asynchronicznego. Na przykład, poniższy program kończy się po println
, lub nie, w zależności od tego, czy dostawca jest JDKAsyncHttpProvider
lub NettyAsyncHttpProvider
:Jak zamknąć AsyncHttpClient z Netty dla asynchronicznego żądania Http?
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());
}
}
O AsynHttpClient
stany dokumentacja:
AHC jest warstwą abstrakcji który może pracować nad JDK, Netty i Grizzly. Zauważ, że implementacja JDK jest bardzo ograniczona i powinieneś NAPRAWDĘ użyć innych prawdziwych dostawców.
Aby użyć AsyncHttpClient z Netty, wystarczy dołączyć odpowiednią bibliotekę do ścieżki klasy java. Tak więc, możemy uruchomić poprzednią Program
z jednej z następujących konfiguracji toru klasa używać Netty, czy nie:
-cp .;async-http-client-1.9.24.jar;netty-3.10.3.Final.jar;slf4j-api-1.7.12.jar
użyjeNettyAsyncHttpProvider
-cp .;async-http-client-1.9.24.jar;slf4j-api-1.7.12.jar
użyjeJDKAsyncHttpProvider
Co jeszcze powinniśmy zrobić, aby poprawnie używać dostawcy Netty? Na przykład zamykam AsyncHttpClient
w AsyncCompletionHandler
. Czy to jest poprawne?
Czy istnieje konfiguracja umożliwiająca zmianę obserwowanego zachowania?
nie jest 'AsyncHttpClient' wątku bezpieczny? Nie twórz nowego dla każdego wywołania metody. –
, jeśli spróbujesz zamknąć klienta znacznie później, np. po 'thenAccept', czy twoja aplikacja zostanie rozwiązana? – ZhongYu
Nie. Zamknięcie, lub nie, asyncHttpClient nie ma wpływu na wynikowe zachowanie. –