JerseyClient异步调用似乎留下挂起的线程

时间:2017-06-02 12:32:06

标签: java multithreading jersey-client

我正在使用jersey-client-3.0-SNAPSHOT。

我做的事情如下:

 final Client client = createClient();

...

    Builder builder = target.request();
    for (final Entry<String, String> entry : getHeaders().entrySet()) {
        builder = builder.header(entry.getKey(), entry.getValue());
    }
    final Builder finalBuilder = builder;
    executor.submit(() -> {
        final Entity<?> entity = createPostEntity();
        futureResponse = finalBuilder.async().post(entity);
        try {
            response = futureResponse.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
            consumeResponse(response);
        } catch (ExecutionException | TimeoutException | InterruptedException | IOException e) {
            errorConsumer.accept(e);
        }
    });

    if (futureResponse != null) {
        try {
            futureResponse.cancel(true);
        } catch (final Exception e) {
            //does nothing, now we try keep closing resources
        }
    }
    if (response != null) {
        try {
            response.close();
        } catch (final Exception e) {
            //does nothing, now we try keep closing resources
        }
    }

... //等待回复,阅读或其他

client.close();

每次创建时都会出现一个新线程并销毁其中一个客户端。

有没有一种安全的方法来销毁这些线程? 这是预期的行为吗? 我做错了吗?

1 个答案:

答案 0 :(得分:2)

asynchronous的{​​{1}}来电中,每当我们在Jersey client对象上致电close()时,它都会销毁client来电中使用的thread。因此,预期行为是每当async语句执行时,它将销毁该线程,下次将为下一个client.close()调用创建一个新线程。

现在,考虑错误情况的关闭async对象和关联线程的安全方法之一如下 -

client