See below , How im using the Client. I believe it's Auto Closable.

I don't think i have an option to close the connection.

PoolingNHttpClientConnectionManager will manage all connections right?

CloseableHttpAsyncClient client =
CustomHttpClientBuilder.buildAsyncHttpClient();
private void executeRequest(final HttpPost postReq){
        try{
            client.execute(postReq, new FutureCallback<HttpResponse>() {
                  public void completed(final HttpResponse response) {
                    try {
                        int statusCode =
response.getStatusLine().getStatusCode();
                        if(statusCode != HttpStatus.SC_OK){
                            LOG.debug("Endpoint : {} responded non 2XX
response , code : {}  , Request : {} ",postReq.getURI(), statusCode,
HttpUtils.getIncomingRequestEntity(postReq.getEntity()));
                        }
                    } catch (Exception e) {
                        LOG.error("error while consuming resp ", e);
                    }finally{
                      HttpClientUtils.closeQuietly(response);
                    }
                }
                public void failed(final Exception ex) {
                    if(ex instanceof java.util.concurrent.TimeoutException){
                        LOG.debug("(TimeoutException) Failed to post events
to destination EndPoint :  {} , Request : {}, Error Msg : {} ",
postReq.getURI(), HttpUtils.getIncomingRequestEntity(postReq.getEntity()),
 ex);
                    }else if( ex instanceof UnknownHostException){
                      LOG.error("UnknownHostException, Connector Key : {} ,
EndPoint: {} ", connectorKey, postReq.getURI());
                    }else if( ex instanceof ConnectException){
                      LOG.error("ConnectException, Connector Key : {} ,
EndPoint: {} ", connectorKey, postReq.getURI());
                    }else if( ex instanceof SocketTimeoutException){
                      LOG.error("SocketTimeoutException, Connector Key : {}
, EndPoint: {} ", connectorKey, postReq.getURI());
                    }else{
                        LOG.error("(Other Exception) Failed to post log to
destination EndPoint :  {} , Connector Key : {}, Error Msg : {}",
postReq.getURI(), connectorKey,  ex.getMessage());
                    }

                }
                public void cancelled() {
                      LOG.error("task cancelled by http client, Retry after
few seconds , Connector Key : {} , EndPoint: {} ", connectorKey,
postReq.getURI());
                }
            });
        }catch (Exception e) {
            LOG.error(" Error while executing POST request : {} , EndPoint
: {} ", HttpUtils.getIncomingRequestEntity(postReq.getEntity()),
postReq.getURI(), e);
        }finally{

        }
    }


On Fri, Aug 28, 2020 at 2:44 PM 樊超 <83035...@qq.com> wrote:

> English is not my native language, please excuse typing errors.
> I guess your problem is that you forget close the connection when
> exception happened.
> If so, you should put the close method in the finally block.
> If connection doesn’t released, the connection pool will be fill up.
>
> 发件人: SenthilKumar K
> 发送时间: 2020年8月28日 16:56
> 收件人: httpclient-users@hc.apache.org
> 抄送: Senthil kumar
> 主题: Task Cancelled by HttpClient - 4.1.4
>
> Hello Experts,  We have been running Apache Async Http Client in Product to
> Post Events to Splunk & Datadog Third-Party Systems. Most of the times it
> works well but when there was some Connection Closed Exception happens for
> a particular endpoint, Client is continuously getting task cancelled error
> which is resulting in the data loss from our side.
>
>
> Context:
> We run the AsyncClient in Container, Configuration of Container: 2 CPUs, 7
> GB memory & 1GB disk.
>
> The moment AsyncHttpClient receives  " Failed to post log to destination
> EndPoint :  https://abcde.com/v1/input/jskjdhk ,  *Error Msg: Connection
> closed " *the all subsequent calls getting task cancelled by http client.
>
> What's wrong with the client configuration? Am i missing something?
>
> Client Settings:
>
> public static final RequestConfig.Builder requestConfigBuilder =
> RequestConfig.custom()
>             .setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_MILLIS) // 10
> seconds
>             .setSocketTimeout(DEFAULT_SOCKET_TIMEOUT_MILLIS) // 10 seconds
>
> .setConnectionRequestTimeout(DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS); //
> 10 seconds
>
> public static final ConnectionConfig connectionConfig =
> ConnectionConfig.custom()
>            .setBufferSize(DEFAULT_BUFFER_SIZE)
>            .setMessageConstraints(messageConstraints)
>            .setFragmentSizeHint(DEFAULT_BUFFER_SIZE)
>            .build();
>
> final PoolingNHttpClientConnectionManager mgr = new
> PoolingNHttpClientConnectionManager(ioreactor, registry);
>        mgr.setDefaultConnectionConfig(connectionConfig);
>        mgr.setMaxTotal(DEFAULT_MAX_CONN_TOTAL); // 500
>        mgr.setDefaultMaxPerRoute(DEFAULT_MAX_CONN_PER_ROUTE); // 25
>        mgr.closeExpiredConnections();
>
>    final HttpAsyncClientBuilder httpClientBuilder =
> HttpAsyncClientBuilder.create()
>
> .setDefaultRequestConfig(requestConfigBuilder.build())
>                          .setMaxConnPerRoute(DEFAULT_MAX_CONN_PER_ROUTE)
> //25
>                          .setMaxConnTotal(DEFAULT_MAX_CONN_TOTAL)//500
>                          .setDefaultConnectionConfig(connectionConfig)
>                          .setConnectionManager(mgr)
>                          .setSSLContext(getSSLContext())
>                          .setSSLHostnameVerifier(hostNameVerifier)
>                          .disableConnectionState()
>                          .disableAuthCaching()
>                          .disableCookieManagement()
>                          .useSystemProperties();
>    CloseableHttpAsyncClient httpClient = httpClientBuilder.build();
>     httpClient.start();
>
>
> <dependency>
>    <groupId>org.apache.httpcomponents</groupId>
>    <artifactId>*httpasyncclient*</artifactId>
>    <version>4.1.4</version>
> </dependency>
>
> --Senthil
>
>
>

Reply via email to