【问题标题】:AsyncInvoker not releasing the ThreadAsyncInvoker 不释放线程
【发布时间】:2016-02-28 04:18:16
【问题描述】:
我正在使用 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;
}
【问题讨论】:
标签:
java
multithreading
jax-rs
jersey-2.0
jersey-client
【解决方案1】:
只要您不对未来值解析后提供给您的实际 javax.ws.rs.core.Response 做任何事情,请求响应流就会保持打开状态(并且与它关联的线程也是原始 HTTP 请求)猜测)。您应该:
- 对
javax.ws.rs.core.Response 对象执行操作并关闭它(或它的流)。
- 使用.get(MyPojo.class) 将响应流转换为实际对象。这将为您关闭流并在将来解析
MyPojo 实例。
【解决方案2】:
您需要关闭您在调用方法中创建的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();
}
}