Я встречаю зашитый вопрос.Когда я вызываю метод 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();
}
}
}
}