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

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

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

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

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

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