L'utilizzo del AsyncHttpClient
con il provider Netty
impedirà il termine del programma principale quando si esegue una richiesta asincrona. Per esempio, il seguente programma termina dopo la println
, o meno, a seconda che il provider è JDKAsyncHttpProvider
o NettyAsyncHttpProvider
:Come chiudere AsyncHttpClient con Netty per una richiesta Http asincrona?
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());
}
}
Chi l'AsynHttpClient
gli stati di documentazione:
AHC è un livello di astrazione che può funzionare in cima al nudo JDK, Netty e Grizzly. Nota che l'implementazione di JDK è molto limitata e dovresti VERAMENTE usare gli altri provider reali.
Per utilizzare AsyncHttpClient con Netty, è sufficiente includere la libreria corrispondente nel percorso di classe java. Quindi, possiamo eseguire la precedente Program
con una delle seguenti configurazioni di percorso classe da utilizzare Netty, oppure no:
-cp .;async-http-client-1.9.24.jar;netty-3.10.3.Final.jar;slf4j-api-1.7.12.jar
utilizzeràNettyAsyncHttpProvider
-cp .;async-http-client-1.9.24.jar;slf4j-api-1.7.12.jar
utilizzeràJDKAsyncHttpProvider
Che altro dovremmo fare per usare correttamente il provider di Netty? Ad esempio, sto chiudendo lo AsyncHttpClient
in AsyncCompletionHandler
. È corretto?
Esiste una configurazione per modificare il comportamento osservato?
non è 'AsyncHttpClient' thread-safe? Non crearne uno nuovo su ogni invocazione di metodo. –
se provi a chiudere il client molto più tardi, ad es. dopo 'thenAccept', l'applicazione si interrompe? – ZhongYu
N. Chiusura, o non, asyncHttpClient non ha alcuna influenza sul comportamento risultante. –