当我们执行异步请求时,使用AsyncHttpClient
withNetty
提供程序将阻止主程序终止。例如,以下程序在 , 之后终止println
,具体取决于提供者是JDKAsyncHttpProvider
还是NettyAsyncHttpProvider
:
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());
}
}
关于AsynHttpClient
文档状态:
AHC 是一个抽象层,可以在裸 JDK、Netty 和 Grizzly 之上工作。请注意,JDK 实现非常有限,您应该真正使用其他真正的提供程序。
要将 AsyncHttpClient 与 Netty 一起使用,我们只需在 java 类路径中包含相应的库。Program
因此,我们可以使用以下类路径配置之一运行先前的配置以使用 Netty,或者不使用:
-cp .;async-http-client-1.9.24.jar;netty-3.10.3.Final.jar;slf4j-api-1.7.12.jar
将使用NettyAsyncHttpProvider
-cp .;async-http-client-1.9.24.jar;slf4j-api-1.7.12.jar
将使用JDKAsyncHttpProvider
我们还应该做什么才能正确使用 Netty 提供者?例如,我正在关闭AsyncHttpClient
in AsyncCompletionHandler
。那是对的吗?
是否有任何配置可以改变观察到的行为?