You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by SenthilKumar K <se...@gmail.com> on 2020/08/28 08:56:40 UTC

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

Re: Task Cancelled by HttpClient - 4.1.4

Posted by SenthilKumar K <se...@gmail.com>.
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 樊超 <83...@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
>
>
>

回复: Task Cancelled by HttpClient - 4.1.4

Posted by 樊超 <83...@qq.com>.
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



Re: Task Cancelled by HttpClient - 4.1.4

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Fri, 2020-08-28 at 14:26 +0530, SenthilKumar K wrote:
> 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_MILLI
> S); //
> 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_ROU
> TE)
> //25
>                          .setMaxConnTotal(DEFAULT_MAX_CONN_TOTAL)//50
> 0
>                          .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



Please post a _complete_ context / wire log of the session.

Oleg


---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org


Do you close the connection when exception has been throw?

Posted by 樊超 <83...@qq.com>.
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.