有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AsyncInvoker未释放线程

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

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;
}

共 (2) 个答案

  1. # 1 楼答案

    您需要关闭在调用方法中创建的client对象。在调用方法中,您将有如下内容:

    Client client = ClientBuilder.newClient();
    
    WebTarget webTarget = client.target(SERVER_URL).path(API_PATH).path(String.valueOf(id));
    
    fire(webTarget);
    

    因此,在调用此方法后,需要关闭client

    client.close()
    

    但是,建议在收到响应后关闭client。比如下面-

    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();
        } 
    }
    
  2. # 2 楼答案

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

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