AsyncHttpClient/async-http-client

use promise mode,MaxConnectionSemaphore do not relase lock until channel close.

zxspopo opened this issue · 2 comments

hi,when i use this code , i found MaxConnectionSemaphore don`t release,cause TooManyConnection Excetion.

DefaultAsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder().setConnectTimeout(60000)
              .setReadTimeout(60000).setRequestTimeout(60000).setMaxConnections(200).setMaxRequestRetry(3).setAcquireFreeChannelTimeout(60000).build();
      AsyncHttpClient asyncHttpClient = Dsl.asyncHttpClient(config);
while (true) {

           String requestUrl ="http://xxx:8080/hello?name=san";
          CompletableFuture<Response> future = asyncHttpClient.prepareGet(requestUrl).execute(new HttpCompletionHandler()).toCompletableFuture();
          future.whenComplete((response, throwable) -> {
              if (throwable == null) {
               
                  // System.out.println(response.getResponseBody());
              } else {
                  if (throwable instanceof TimeoutException) {
                      System.err.println(throwable.getMessage());
                  } else {
                      // 请求失败
                      throwable.printStackTrace();
                  }
              }
          });
          // });
      }

change code like this maybe resolve this problem, is it correct?
NettyConnectListener.java

  public void onSuccess(Channel channel, InetSocketAddress remoteAddress) {

    if (connectionSemaphore != null) {
      // transfer lock from future to channel
      **//Object partitionKeyLock = future.takePartitionKeyLock();
     //change this code 
      Object partitionKeyLock = future.getPartitionKey();**

      if (partitionKeyLock != null) {
        channel.closeFuture().addListener(future -> connectionSemaphore.releaseChannelLock(partitionKeyLock));
      }
    }

Version?

@hyperxpro 2.12.3 tks