AsyncInvoker没有发布Thread

时间:2015-11-25 11:32:01

标签: java multithreading jax-rs jersey-2.0 jersey-client

我正在使用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 个答案:

答案 0 :(得分:0)

只要您未对未来值结算时提供给您的实际javax.ws.rs.core.Response执行任何操作,请求响应流将保持打开状态(与之关联的线程为原始HTTP)请求我猜)。你应该:

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

答案 1 :(得分:0)

您需要关闭在调用方法中创建的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();
    } 
}