我正在尝试使用JAX-RS客户端API通过HTTP GET请求资源,使用以下代码:(我使用了jersey-client v2.12和resteasy-client v3.0.8.Final来测试实现)
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.InvocationCallback;
public class StackOverflowExample {
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...");
}
});
}
}
正如我所料,String几乎立即打印出来。但是这个过程一直运行大约一分钟,尽管没有任何代码可以执行。
JAX-RS规范只是说我们应该使用InvocationCallback
而不是我的问题。但即使我使用Future
,也会发生相同的效果。我也测试过,如果这与超时有关,那是非常不可能和错误的。调试器显示在重新安装的情况下有一些线程运行DestroyJavaVM
和jersey-client-async-executor-0
或pool-1-thread-1
。
你知道这里出了什么问题吗?
答案 0 :(得分:1)
咨询JavaDoc总是有帮助的。关于我的问题it says:
客户端是管理客户端通信基础架构的重量级对象。初始化以及客户端实例的处置可能是相当昂贵的操作。因此,建议在应用程序中仅构造少量Client实例。客户端实例必须在处置前正确关闭,以避免资源泄漏。
如果我正确关闭客户端,一切都按预期工作。
public class StackOverflowExample {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
// request here
client.close();
}
}