Java AsyncInvoker未释放线程

Java AsyncInvoker未释放线程,java,multithreading,jax-rs,jersey-2.0,jersey-client,Java,Multithreading,Jax Rs,Jersey 2.0,Jersey Client,我使用的是AsyncInvoker和Jersey 2.0。这对我来说很好。然而,线程并没有在返回完成后结束。请注意,我不希望我呼叫的服务有任何响应 public Future<Response> fire(WebTarget webTarget) { Future<Response> response = null; try { response = webTarget.request(MediaType.APPLICATION_JSON

我使用的是
AsyncInvoker
和Jersey 2.0。这对我来说很好。然而,线程并没有在返回完成后结束。请注意,我不希望我呼叫的服务有任何响应

public Future<Response> fire(WebTarget webTarget) {
    Future<Response> response = null;

    try {
        response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
                             .accept(MediaType.APPLICATION_JSON_TYPE)
                             .headers(headers)
                             .async().get();
    }

    catch (Exception e) {  
        e.printStackTrace();
    } 

    return response;
}
公共未来火灾(WebTarget WebTarget){
未来响应=空;
试一试{
response=webTarget.request(MediaType.APPLICATION\u JSON\u类型)
.accept(MediaType.APPLICATION\u JSON\u类型)
.标题(标题)
.async().get();
}
捕获(例外e){
e、 printStackTrace();
} 
返回响应;
}

只要您不使用提供给您的实际
javax.ws.rs.core.Response
执行任何操作,在未来值解析后,请求-响应流将保持打开状态(我猜与之关联的线程也将是原始HTTP请求)。你应该:

  • 使用
    javax.ws.rs.core.Response
    对象执行一些操作并关闭它(或它的流)
  • 用于将响应蒸汽转换为实际对象。这将为您关闭流,并在将来解析一个
    MyPojo
    实例

  • 您需要关闭在调用方法中创建的
    客户端
    对象。在调用方法中,您将有如下内容-

    Client client = ClientBuilder.newClient();
    
    WebTarget webTarget = client.target(SERVER_URL).path(API_PATH).path(String.valueOf(id));
    
    fire(webTarget);
    
    public void fire(WebTarget webTarget) {
    
        try {
            webTarget.request(MediaType.APPLICATION_JSON_TYPE)
                                 .accept(MediaType.APPLICATION_JSON_TYPE)
                                 .headers(headers)
                                 .async().get(new InvocationCallback<Response>() {
    
              @Override
              public void completed(Response response) {
                  // Do whatever your wish with response
                  client.close();
              }
    
              @Override
              public void failed(Throwable throwable) {
                  throwable.printStackTrace();
                  client.close();
              }
          });
        }
        catch (Exception e) {  
            e.printStackTrace();
        } 
    }
    
    因此,在调用此方法后,您需要关闭
    客户端
    -

    client.close()
    
    但是,建议在收到响应后关闭客户机。像下面这样-

    Client client = ClientBuilder.newClient();
    
    WebTarget webTarget = client.target(SERVER_URL).path(API_PATH).path(String.valueOf(id));
    
    fire(webTarget);
    
    public void fire(WebTarget webTarget) {
    
        try {
            webTarget.request(MediaType.APPLICATION_JSON_TYPE)
                                 .accept(MediaType.APPLICATION_JSON_TYPE)
                                 .headers(headers)
                                 .async().get(new InvocationCallback<Response>() {
    
              @Override
              public void completed(Response response) {
                  // Do whatever your wish with response
                  client.close();
              }
    
              @Override
              public void failed(Throwable throwable) {
                  throwable.printStackTrace();
                  client.close();
              }
          });
        }
        catch (Exception e) {  
            e.printStackTrace();
        } 
    }
    
    public void fire(WebTarget-WebTarget){
    试一试{
    webTarget.request(MediaType.APPLICATION\u JSON\u类型)
    .accept(MediaType.APPLICATION\u JSON\u类型)
    .标题(标题)
    .async().get(新调用回调()){
    @凌驾
    已完成公共作废(响应){
    //随你的意愿去做,并做出回应
    client.close();
    }
    @凌驾
    公共作废失败(可丢弃可丢弃){
    printStackTrace();
    client.close();
    }
    });
    }
    捕获(例外e){
    e、 printStackTrace();
    } 
    }
    
    任何解决方案技术人员!!!