JAX-RS客户端API异步请求
问题描述:
我想使用JAX-RS客户端API通过HTTP GET请求资源,通过使用以下代码:(我使用jersey-client v2.12以及resteasy-client v3 .0.8。最后测试实现)JAX-RS客户端API异步请求
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.InvocationCallback;
public class *Example {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
client.target("http://example.com/").request().async().get(new InvocationCallback<String>() {
@Override
public void completed(String s) {
System.out.println("Async got: " + s);
}
@Override
public void failed(Throwable throwable) {
System.out.println("Async failure...");
}
});
}
}
正如我预期的字符串打印几乎立即。但是这个过程持续运行大约一分钟,尽管没有任何应该执行的代码。 JAX-RS规范只是说我们应该使用InvocationCallback
而没有别的对我的问题至关重要。但即使我使用Future
也会产生相同的效果。我还测试过,如果这与超时有关,这是非常不可能和错误的。调试器显示有一些线程正在运行,即DestroyJavaVM
和jersey-client-async-executor-0
或pool-1-thread-1
在resteasy的情况下。
你知道这里出了什么问题吗?
答
咨询JavaDoc是非常有帮助的。关于我的问题it says:
客户端是管理客户端通信基础设施的重量级对象。初始化以及处理客户端实例可能是一个相当昂贵的操作。因此建议在应用程序中只构建少量的客户端实例。客户端实例在处置之前必须正确关闭以避免资源泄露。
如果我正确关闭客户端,一切都按预期工作。
public class *Example {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
// request here
client.close();
}
}