DeadLock происходит при вызове метода CloseableHttpAsyncClient Close - PullRequest
0 голосов
/ 14 июня 2019

Я встречаю зашитый вопрос.Когда я вызываю метод HttpAsyncClients.excute, если сеть нестабильна (не может подключиться к серверу), будет вызван сбойный метод.

Затем он вызовет метод CloseableHttpAsyncClient.close, который заблокирован.Это делает программу неправильной.Как избежать тупика при закрытии CloseableHttpAsyncClient?

Ниже приведен код:

public static void sendPostAsync(String url, String param) {
    try {
        final CloseableHttpAsyncClient httpClient = HttpAsyncClients.createDefault();
        httpClient.start();
        final HttpPost request = new HttpPost(url);
        StringEntity se = new StringEntity(param, "UTF-8");
        request.setEntity(se);
        request.addHeader(new BasicHeader("Content-Type", "application/json"));

        httpClient.execute(request, new FutureCallback<HttpResponse>() {
            public void completed(final HttpResponse response) {
                try {
                    String requestContent = null;
                    try {
                        requestContent = EntityUtils.toString(request.getEntity());
                    } finally {
                        EntityUtils.consume(request.getEntity());
                    }

                    String content = null;
                    try {
                        content = EntityUtils.toString(response.getEntity());
                    } finally {
                        EntityUtils.consume(response.getEntity());
                    }



                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    close(httpClient);
                }
            }


            public void failed(final Exception ex) {
                close(httpClient);
                System.out.println(request.getRequestLine() + "->" + ex);
                System.out.println(" callback thread id is : " + Thread.currentThread().getId());
            }


            public void cancelled() {
                close(httpClient);
                System.out.println(request.getRequestLine() + " cancelled");
                System.out.println(" callback thread id is : " + Thread.currentThread().getId());
            }


            private void close(CloseableHttpAsyncClient client) {
                try {
                    System.out.println("sendPostJsonAsync httpClient.close()");
                    client.close();//blocked here
                } catch (IOException ex) {

                }
            }

        });

    } catch (Exception e1) {
        logger.error("sendPostJson", e1);
        e1.printStackTrace();
    }
}

Исходный код client.close выглядит следующим образом:

    @Override
public void close() {
    if (this.status.compareAndSet(Status.ACTIVE, Status.STOPPED)) {
        if (this.reactorThread != null) {
            try {
                this.connmgr.shutdown();
            } catch (final IOException ex) {
                this.log.error("I/O error shutting down connection manager", ex);
            }
            try {
                this.reactorThread.join();
            } catch (final InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...