JAX-RS客户端API异步请求

时间:2014-09-04 09:04:56

标签: jax-rs resteasy jersey-client

我正在尝试使用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,也会发生相同的效果。我也测试过,如果这与超时有关,那是非常不可能和错误的。调试器显示在重新安装的情况下有一些线程运行DestroyJavaVMjersey-client-async-executor-0pool-1-thread-1

你知道这里出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

咨询JavaDoc总是有帮助的。关于我的问题it says

  

客户端是管理客户端通信基础架构的重量级对象。初始化以及客户端实例的处置可能是相当昂贵的操作。因此,建议在应用程序中仅构造少量Client实例。客户端实例必须在处置前正确关闭,以避免资源泄漏。

如果我正确关闭客户端,一切都按预期工作。

public class StackOverflowExample {
  public static void main(String[] args) {
    Client client = ClientBuilder.newClient();
    // request here
    client.close();
  }
}