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 Check Peck <co...@gmail.com> on 2015/06/04 17:51:24 UTC

What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am
using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this
since that's what we are using in our company.

Now machine which is running my code (which uses RestTemplate) to make call
to my RestService, I see lot of TIME_WAIT connections opened on that
particular machine?

- Is there any reason why it happens with RestTemplate or the way I am
using it?
- Also, what is the connection between TIME_WAIT and HTTP Client calls to
my RestService? I am not able to understand this as well. Does HTTP Calls
has any significance on TIME_WAIT? There might be some theoretical
explanation for this I guess.

Below is how I am using RestTemplate in my code base:

    public class DataClient implements Client {

        private final RestTemplate restTemplate = new RestTemplate();
        private ExecutorService executor = Executors.newFixedThreadPool(10);

        // for synchronous call
        @Override
        public String getSyncData(DataKey key) {
            String response = null;
            Future<String> handler = null;
            try {
                handler = getAsyncData(key);
                response = handler.get(key.getTimeout(),
TimeUnit.MILLISECONDS);
            } catch (TimeoutException ex) {
                // log an exception
                handler.cancel(true);
            } catch (Exception ex) {
                // log an exception
            }

            return response;
        }

        // for asynchronous call
        @Override
        public Future<String> getAsyncData(DataKey key) {
            Future<String> future = null;

            try {
                Task task = new Task(key, restTemplate);
                future = executor.submit(task);
            } catch (Exception ex) {
                // log an exception
            }

            return future;
        }
    }

And below is my simple Task class

    class Task implements Callable<String> {

        private final RestTemplate restTemplate;
        private final DataKey key;

        public Task(DataKey key, RestTemplate restTemplate) {
            this.key = key;
            this.restTemplate = restTemplate;
        }

        public String call() throws Exception {
            ResponseEntity<String> response = null;

            String url = "some_url_created_by_using_key";

            // handling all try catch here
            response = restTemplate.exchange(url, HttpMethod.GET, null,
String.class);

            return response.getBody();
        }
    }

And here is netstat details on my box which is running my code to make HTTP
Calls to my RestService. I am always seeing very high number of TIME_WAIT
connections.

         72 ESTABLISHED
          2 FIN_WAIT1
         17 LISTEN
       3405 TIME_WAIT

Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Check Peck <co...@gmail.com>.
Thanks Oleg. Also I was not able to understand what does
setExpectContinueEnabled mean? Should this be enabled or disabled for
performance improvements?

On Fri, Jun 26, 2015 at 1:22 AM, Oleg Kalnichevski <ol...@apache.org> wrote:

> On Thu, 2015-06-25 at 12:33 -0700, Check Peck wrote:
> > Thanks Oleg. Got the idea now. Basically earlier, I was not using setting
> > any timeout value on Http request but I was setting the timeout value on
> my
> > Future and by default the timeout value on http request was -1 so it was
> > waiting for most of the time and that's why I was seeing lot of
> TIME_WAIT.
> > I have made the code changes like this now:
> >
> > This is the request factory I am setting on my RestTemplate now. I wanted
> > to check with you to see, do you think these settings are ok for better
> > performance?
> >
> >         private ClientHttpRequestFactory clientHttpRequestFactory() {
> >             HttpComponentsClientHttpRequestFactory requestFactory = new
> > HttpComponentsClientHttpRequestFactory();
> >             RequestConfig requestConfig =
> >
> RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
> >
> > .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
> >             SocketConfig socketConfig =
> > SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();
> >
> >             PoolingHttpClientConnectionManager
> > poolingHttpClientConnectionManager = new
> > PoolingHttpClientConnectionManager();
> >             poolingHttpClientConnectionManager.setMaxTotal(800);
> >
>  poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700);
> >
> >             CloseableHttpClient httpClientBuilder =
> > HttpClientBuilder.create()
> >
> >
> .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
> >                     .setDefaultSocketConfig(socketConfig).build();
> >
> >             requestFactory.setHttpClient(httpClientBuilder);
> >             return requestFactory;
> >         }
> >
>
> Settings look reasonable to me.
>
> Oleg
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
>
>

Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Thu, 2015-06-25 at 12:33 -0700, Check Peck wrote:
> Thanks Oleg. Got the idea now. Basically earlier, I was not using setting
> any timeout value on Http request but I was setting the timeout value on my
> Future and by default the timeout value on http request was -1 so it was
> waiting for most of the time and that's why I was seeing lot of TIME_WAIT.
> I have made the code changes like this now:
> 
> This is the request factory I am setting on my RestTemplate now. I wanted
> to check with you to see, do you think these settings are ok for better
> performance?
> 
>         private ClientHttpRequestFactory clientHttpRequestFactory() {
>             HttpComponentsClientHttpRequestFactory requestFactory = new
> HttpComponentsClientHttpRequestFactory();
>             RequestConfig requestConfig =
> RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
> 
> .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
>             SocketConfig socketConfig =
> SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();
> 
>             PoolingHttpClientConnectionManager
> poolingHttpClientConnectionManager = new
> PoolingHttpClientConnectionManager();
>             poolingHttpClientConnectionManager.setMaxTotal(800);
>             poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700);
> 
>             CloseableHttpClient httpClientBuilder =
> HttpClientBuilder.create()
> 
> .setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
>                     .setDefaultSocketConfig(socketConfig).build();
> 
>             requestFactory.setHttpClient(httpClientBuilder);
>             return requestFactory;
>         }
> 

Settings look reasonable to me.

Oleg



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


Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Check Peck <co...@gmail.com>.
Thanks Oleg. Got the idea now. Basically earlier, I was not using setting
any timeout value on Http request but I was setting the timeout value on my
Future and by default the timeout value on http request was -1 so it was
waiting for most of the time and that's why I was seeing lot of TIME_WAIT.
I have made the code changes like this now:

This is the request factory I am setting on my RestTemplate now. I wanted
to check with you to see, do you think these settings are ok for better
performance?

        private ClientHttpRequestFactory clientHttpRequestFactory() {
            HttpComponentsClientHttpRequestFactory requestFactory = new
HttpComponentsClientHttpRequestFactory();
            RequestConfig requestConfig =
RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)

.setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
            SocketConfig socketConfig =
SocketConfig.custom().setSoKeepAlive(true).setTcpNoDelay(true).build();

            PoolingHttpClientConnectionManager
poolingHttpClientConnectionManager = new
PoolingHttpClientConnectionManager();
            poolingHttpClientConnectionManager.setMaxTotal(800);
            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(700);

            CloseableHttpClient httpClientBuilder =
HttpClientBuilder.create()

.setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig)
                    .setDefaultSocketConfig(socketConfig).build();

            requestFactory.setHttpClient(httpClientBuilder);
            return requestFactory;
        }

On Fri, Jun 5, 2015 at 1:04 AM, Oleg Kalnichevski <ol...@apache.org> wrote:

> On Thu, 2015-06-04 at 15:32 -0700, Check Peck wrote:
> > @Michael: Thanks for your suggestion. Can you explain me why do you
> think,
> > it's a TCP issue? I was assuming may be the way I am using RestTemplate
> in
> > my code might not be right and that's why it might be resulting in
> > TIME_WAIT connections a lot on the machine where I have my code deployed
> > which makes Http Call to my RestService? In the company I am working
> here,
> > they have their own Parent POM in which they have spring dependency, the
> > latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8
> > uses new version of HttpClient or not. I did check the first github link
> > you provided but I was not able to find "ivy.xml" file in 3.2.x branch so
> > cannot confirm that. May be you know some other way to confirm that. I
> can
> > use Spring 3.2.8 version max here. And also, do you see any issues with
> the
> > way I am using RestTemplate here, I am just using default way of making
> > HttpClient calls, may be I need to have some sort of extra parameter to
> > resolve this issue? Are there anything I need to set while making
> > RestTemplate calls like "Connection: close" or "keep-alive" anything like
> > this? And also do you think the way I am using RestTemplate will
> reuse/pool
> > my client connections or not?
> >
> > @Stefan: I am using RestTemplate in default way as shown in my above
> code.
> > I am assuming, it will be reusing/pooling my connections right? I did
> > google the issue and I found out lot of things, like lowering down the
> > "tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned
> > here in this article:
> >
> > http://www.fromdual.com/huge-amount-of-time-wait-connections
> >
> > But I was trying to confirm whether it might be related to how I am using
> > RestTemplate or it is a OS issue? If I can confirm it's an OS issue,
> then I
> > will look into that and if let's say the way I am using RestTemplate is
> not
> > right, then I might try improving my code to see whether the problem goes
> > away or not. I am thinking may be the way I am using RestTemplate is not
> > right? May be I need to have "keep-alive" options on?
> >
>
> Connections in TIME_WAIT are perfectly normal depending on your OS
> systems and do not represent an issue with HttpClient resource
> management.
>
> For details see
>
> http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions
>
> Oleg
>
>
> >
> > On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø <
> > stefan.landro@gmail.com> wrote:
> >
> > > I presume you are reusing/pooling your client connections, right?
> > > Also - you could tune your OS to shutdown connections faster. You can
> > > easily google you issue.
> > >
> > > Stefan
> > >
> > > 2015-06-04 17:51 GMT+02:00 Check Peck <co...@gmail.com>:
> > >
> > > > I am using Spring RestTemplate to make a HTTP Calls to my
> RestService. I
> > > am
> > > > using spring framework 3.1.1 version of RestTemplate. I cannot
> upgrade
> > > this
> > > > since that's what we are using in our company.
> > > >
> > > > Now machine which is running my code (which uses RestTemplate) to
> make
> > > call
> > > > to my RestService, I see lot of TIME_WAIT connections opened on that
> > > > particular machine?
> > > >
> > > > - Is there any reason why it happens with RestTemplate or the way I
> am
> > > > using it?
> > > > - Also, what is the connection between TIME_WAIT and HTTP Client
> calls to
> > > > my RestService? I am not able to understand this as well. Does HTTP
> Calls
> > > > has any significance on TIME_WAIT? There might be some theoretical
> > > > explanation for this I guess.
> > > >
> > > > Below is how I am using RestTemplate in my code base:
> > > >
> > > >     public class DataClient implements Client {
> > > >
> > > >         private final RestTemplate restTemplate = new RestTemplate();
> > > >         private ExecutorService executor =
> > > > Executors.newFixedThreadPool(10);
> > > >
> > > >         // for synchronous call
> > > >         @Override
> > > >         public String getSyncData(DataKey key) {
> > > >             String response = null;
> > > >             Future<String> handler = null;
> > > >             try {
> > > >                 handler = getAsyncData(key);
> > > >                 response = handler.get(key.getTimeout(),
> > > > TimeUnit.MILLISECONDS);
> > > >             } catch (TimeoutException ex) {
> > > >                 // log an exception
> > > >                 handler.cancel(true);
> > > >             } catch (Exception ex) {
> > > >                 // log an exception
> > > >             }
> > > >
> > > >             return response;
> > > >         }
> > > >
> > > >         // for asynchronous call
> > > >         @Override
> > > >         public Future<String> getAsyncData(DataKey key) {
> > > >             Future<String> future = null;
> > > >
> > > >             try {
> > > >                 Task task = new Task(key, restTemplate);
> > > >                 future = executor.submit(task);
> > > >             } catch (Exception ex) {
> > > >                 // log an exception
> > > >             }
> > > >
> > > >             return future;
> > > >         }
> > > >     }
> > > >
> > > > And below is my simple Task class
> > > >
> > > >     class Task implements Callable<String> {
> > > >
> > > >         private final RestTemplate restTemplate;
> > > >         private final DataKey key;
> > > >
> > > >         public Task(DataKey key, RestTemplate restTemplate) {
> > > >             this.key = key;
> > > >             this.restTemplate = restTemplate;
> > > >         }
> > > >
> > > >         public String call() throws Exception {
> > > >             ResponseEntity<String> response = null;
> > > >
> > > >             String url = "some_url_created_by_using_key";
> > > >
> > > >             // handling all try catch here
> > > >             response = restTemplate.exchange(url, HttpMethod.GET,
> null,
> > > > String.class);
> > > >
> > > >             return response.getBody();
> > > >         }
> > > >     }
> > > >
> > > > And here is netstat details on my box which is running my code to
> make
> > > HTTP
> > > > Calls to my RestService. I am always seeing very high number of
> TIME_WAIT
> > > > connections.
> > > >
> > > >          72 ESTABLISHED
> > > >           2 FIN_WAIT1
> > > >          17 LISTEN
> > > >        3405 TIME_WAIT
> > > >
> > >
> > >
> > >
> > > --
> > > BEKK Open
> > > http://open.bekk.no
> > >
> > > TesTcl - a unit test framework for iRules
> > > http://testcl.com
> > >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
> For additional commands, e-mail: httpclient-users-help@hc.apache.org
>
>

Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Thu, 2015-06-04 at 15:32 -0700, Check Peck wrote:
> @Michael: Thanks for your suggestion. Can you explain me why do you think,
> it's a TCP issue? I was assuming may be the way I am using RestTemplate in
> my code might not be right and that's why it might be resulting in
> TIME_WAIT connections a lot on the machine where I have my code deployed
> which makes Http Call to my RestService? In the company I am working here,
> they have their own Parent POM in which they have spring dependency, the
> latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8
> uses new version of HttpClient or not. I did check the first github link
> you provided but I was not able to find "ivy.xml" file in 3.2.x branch so
> cannot confirm that. May be you know some other way to confirm that. I can
> use Spring 3.2.8 version max here. And also, do you see any issues with the
> way I am using RestTemplate here, I am just using default way of making
> HttpClient calls, may be I need to have some sort of extra parameter to
> resolve this issue? Are there anything I need to set while making
> RestTemplate calls like "Connection: close" or "keep-alive" anything like
> this? And also do you think the way I am using RestTemplate will reuse/pool
> my client connections or not?
> 
> @Stefan: I am using RestTemplate in default way as shown in my above code.
> I am assuming, it will be reusing/pooling my connections right? I did
> google the issue and I found out lot of things, like lowering down the
> "tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned
> here in this article:
> 
> http://www.fromdual.com/huge-amount-of-time-wait-connections
> 
> But I was trying to confirm whether it might be related to how I am using
> RestTemplate or it is a OS issue? If I can confirm it's an OS issue, then I
> will look into that and if let's say the way I am using RestTemplate is not
> right, then I might try improving my code to see whether the problem goes
> away or not. I am thinking may be the way I am using RestTemplate is not
> right? May be I need to have "keep-alive" options on?
> 

Connections in TIME_WAIT are perfectly normal depending on your OS
systems and do not represent an issue with HttpClient resource
management.

For details see
http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions

Oleg 


> 
> On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø <
> stefan.landro@gmail.com> wrote:
> 
> > I presume you are reusing/pooling your client connections, right?
> > Also - you could tune your OS to shutdown connections faster. You can
> > easily google you issue.
> >
> > Stefan
> >
> > 2015-06-04 17:51 GMT+02:00 Check Peck <co...@gmail.com>:
> >
> > > I am using Spring RestTemplate to make a HTTP Calls to my RestService. I
> > am
> > > using spring framework 3.1.1 version of RestTemplate. I cannot upgrade
> > this
> > > since that's what we are using in our company.
> > >
> > > Now machine which is running my code (which uses RestTemplate) to make
> > call
> > > to my RestService, I see lot of TIME_WAIT connections opened on that
> > > particular machine?
> > >
> > > - Is there any reason why it happens with RestTemplate or the way I am
> > > using it?
> > > - Also, what is the connection between TIME_WAIT and HTTP Client calls to
> > > my RestService? I am not able to understand this as well. Does HTTP Calls
> > > has any significance on TIME_WAIT? There might be some theoretical
> > > explanation for this I guess.
> > >
> > > Below is how I am using RestTemplate in my code base:
> > >
> > >     public class DataClient implements Client {
> > >
> > >         private final RestTemplate restTemplate = new RestTemplate();
> > >         private ExecutorService executor =
> > > Executors.newFixedThreadPool(10);
> > >
> > >         // for synchronous call
> > >         @Override
> > >         public String getSyncData(DataKey key) {
> > >             String response = null;
> > >             Future<String> handler = null;
> > >             try {
> > >                 handler = getAsyncData(key);
> > >                 response = handler.get(key.getTimeout(),
> > > TimeUnit.MILLISECONDS);
> > >             } catch (TimeoutException ex) {
> > >                 // log an exception
> > >                 handler.cancel(true);
> > >             } catch (Exception ex) {
> > >                 // log an exception
> > >             }
> > >
> > >             return response;
> > >         }
> > >
> > >         // for asynchronous call
> > >         @Override
> > >         public Future<String> getAsyncData(DataKey key) {
> > >             Future<String> future = null;
> > >
> > >             try {
> > >                 Task task = new Task(key, restTemplate);
> > >                 future = executor.submit(task);
> > >             } catch (Exception ex) {
> > >                 // log an exception
> > >             }
> > >
> > >             return future;
> > >         }
> > >     }
> > >
> > > And below is my simple Task class
> > >
> > >     class Task implements Callable<String> {
> > >
> > >         private final RestTemplate restTemplate;
> > >         private final DataKey key;
> > >
> > >         public Task(DataKey key, RestTemplate restTemplate) {
> > >             this.key = key;
> > >             this.restTemplate = restTemplate;
> > >         }
> > >
> > >         public String call() throws Exception {
> > >             ResponseEntity<String> response = null;
> > >
> > >             String url = "some_url_created_by_using_key";
> > >
> > >             // handling all try catch here
> > >             response = restTemplate.exchange(url, HttpMethod.GET, null,
> > > String.class);
> > >
> > >             return response.getBody();
> > >         }
> > >     }
> > >
> > > And here is netstat details on my box which is running my code to make
> > HTTP
> > > Calls to my RestService. I am always seeing very high number of TIME_WAIT
> > > connections.
> > >
> > >          72 ESTABLISHED
> > >           2 FIN_WAIT1
> > >          17 LISTEN
> > >        3405 TIME_WAIT
> > >
> >
> >
> >
> > --
> > BEKK Open
> > http://open.bekk.no
> >
> > TesTcl - a unit test framework for iRules
> > http://testcl.com
> >



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


Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Check Peck <co...@gmail.com>.
@Michael: Thanks for your suggestion. Can you explain me why do you think,
it's a TCP issue? I was assuming may be the way I am using RestTemplate in
my code might not be right and that's why it might be resulting in
TIME_WAIT connections a lot on the machine where I have my code deployed
which makes Http Call to my RestService? In the company I am working here,
they have their own Parent POM in which they have spring dependency, the
latest I can get for Spring is 3.2.8: I am not sure whether Spring 3.2.8
uses new version of HttpClient or not. I did check the first github link
you provided but I was not able to find "ivy.xml" file in 3.2.x branch so
cannot confirm that. May be you know some other way to confirm that. I can
use Spring 3.2.8 version max here. And also, do you see any issues with the
way I am using RestTemplate here, I am just using default way of making
HttpClient calls, may be I need to have some sort of extra parameter to
resolve this issue? Are there anything I need to set while making
RestTemplate calls like "Connection: close" or "keep-alive" anything like
this? And also do you think the way I am using RestTemplate will reuse/pool
my client connections or not?

@Stefan: I am using RestTemplate in default way as shown in my above code.
I am assuming, it will be reusing/pooling my connections right? I did
google the issue and I found out lot of things, like lowering down the
"tcp_fin_timeout" value from 60 to 30 and some other stuff as mentioned
here in this article:

http://www.fromdual.com/huge-amount-of-time-wait-connections

But I was trying to confirm whether it might be related to how I am using
RestTemplate or it is a OS issue? If I can confirm it's an OS issue, then I
will look into that and if let's say the way I am using RestTemplate is not
right, then I might try improving my code to see whether the problem goes
away or not. I am thinking may be the way I am using RestTemplate is not
right? May be I need to have "keep-alive" options on?


On Thu, Jun 4, 2015 at 12:52 PM, Stefan Magnus Landrø <
stefan.landro@gmail.com> wrote:

> I presume you are reusing/pooling your client connections, right?
> Also - you could tune your OS to shutdown connections faster. You can
> easily google you issue.
>
> Stefan
>
> 2015-06-04 17:51 GMT+02:00 Check Peck <co...@gmail.com>:
>
> > I am using Spring RestTemplate to make a HTTP Calls to my RestService. I
> am
> > using spring framework 3.1.1 version of RestTemplate. I cannot upgrade
> this
> > since that's what we are using in our company.
> >
> > Now machine which is running my code (which uses RestTemplate) to make
> call
> > to my RestService, I see lot of TIME_WAIT connections opened on that
> > particular machine?
> >
> > - Is there any reason why it happens with RestTemplate or the way I am
> > using it?
> > - Also, what is the connection between TIME_WAIT and HTTP Client calls to
> > my RestService? I am not able to understand this as well. Does HTTP Calls
> > has any significance on TIME_WAIT? There might be some theoretical
> > explanation for this I guess.
> >
> > Below is how I am using RestTemplate in my code base:
> >
> >     public class DataClient implements Client {
> >
> >         private final RestTemplate restTemplate = new RestTemplate();
> >         private ExecutorService executor =
> > Executors.newFixedThreadPool(10);
> >
> >         // for synchronous call
> >         @Override
> >         public String getSyncData(DataKey key) {
> >             String response = null;
> >             Future<String> handler = null;
> >             try {
> >                 handler = getAsyncData(key);
> >                 response = handler.get(key.getTimeout(),
> > TimeUnit.MILLISECONDS);
> >             } catch (TimeoutException ex) {
> >                 // log an exception
> >                 handler.cancel(true);
> >             } catch (Exception ex) {
> >                 // log an exception
> >             }
> >
> >             return response;
> >         }
> >
> >         // for asynchronous call
> >         @Override
> >         public Future<String> getAsyncData(DataKey key) {
> >             Future<String> future = null;
> >
> >             try {
> >                 Task task = new Task(key, restTemplate);
> >                 future = executor.submit(task);
> >             } catch (Exception ex) {
> >                 // log an exception
> >             }
> >
> >             return future;
> >         }
> >     }
> >
> > And below is my simple Task class
> >
> >     class Task implements Callable<String> {
> >
> >         private final RestTemplate restTemplate;
> >         private final DataKey key;
> >
> >         public Task(DataKey key, RestTemplate restTemplate) {
> >             this.key = key;
> >             this.restTemplate = restTemplate;
> >         }
> >
> >         public String call() throws Exception {
> >             ResponseEntity<String> response = null;
> >
> >             String url = "some_url_created_by_using_key";
> >
> >             // handling all try catch here
> >             response = restTemplate.exchange(url, HttpMethod.GET, null,
> > String.class);
> >
> >             return response.getBody();
> >         }
> >     }
> >
> > And here is netstat details on my box which is running my code to make
> HTTP
> > Calls to my RestService. I am always seeing very high number of TIME_WAIT
> > connections.
> >
> >          72 ESTABLISHED
> >           2 FIN_WAIT1
> >          17 LISTEN
> >        3405 TIME_WAIT
> >
>
>
>
> --
> BEKK Open
> http://open.bekk.no
>
> TesTcl - a unit test framework for iRules
> http://testcl.com
>

Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Stefan Magnus Landrø <st...@gmail.com>.
I presume you are reusing/pooling your client connections, right?
Also - you could tune your OS to shutdown connections faster. You can
easily google you issue.

Stefan

2015-06-04 17:51 GMT+02:00 Check Peck <co...@gmail.com>:

> I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am
> using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this
> since that's what we are using in our company.
>
> Now machine which is running my code (which uses RestTemplate) to make call
> to my RestService, I see lot of TIME_WAIT connections opened on that
> particular machine?
>
> - Is there any reason why it happens with RestTemplate or the way I am
> using it?
> - Also, what is the connection between TIME_WAIT and HTTP Client calls to
> my RestService? I am not able to understand this as well. Does HTTP Calls
> has any significance on TIME_WAIT? There might be some theoretical
> explanation for this I guess.
>
> Below is how I am using RestTemplate in my code base:
>
>     public class DataClient implements Client {
>
>         private final RestTemplate restTemplate = new RestTemplate();
>         private ExecutorService executor =
> Executors.newFixedThreadPool(10);
>
>         // for synchronous call
>         @Override
>         public String getSyncData(DataKey key) {
>             String response = null;
>             Future<String> handler = null;
>             try {
>                 handler = getAsyncData(key);
>                 response = handler.get(key.getTimeout(),
> TimeUnit.MILLISECONDS);
>             } catch (TimeoutException ex) {
>                 // log an exception
>                 handler.cancel(true);
>             } catch (Exception ex) {
>                 // log an exception
>             }
>
>             return response;
>         }
>
>         // for asynchronous call
>         @Override
>         public Future<String> getAsyncData(DataKey key) {
>             Future<String> future = null;
>
>             try {
>                 Task task = new Task(key, restTemplate);
>                 future = executor.submit(task);
>             } catch (Exception ex) {
>                 // log an exception
>             }
>
>             return future;
>         }
>     }
>
> And below is my simple Task class
>
>     class Task implements Callable<String> {
>
>         private final RestTemplate restTemplate;
>         private final DataKey key;
>
>         public Task(DataKey key, RestTemplate restTemplate) {
>             this.key = key;
>             this.restTemplate = restTemplate;
>         }
>
>         public String call() throws Exception {
>             ResponseEntity<String> response = null;
>
>             String url = "some_url_created_by_using_key";
>
>             // handling all try catch here
>             response = restTemplate.exchange(url, HttpMethod.GET, null,
> String.class);
>
>             return response.getBody();
>         }
>     }
>
> And here is netstat details on my box which is running my code to make HTTP
> Calls to my RestService. I am always seeing very high number of TIME_WAIT
> connections.
>
>          72 ESTABLISHED
>           2 FIN_WAIT1
>          17 LISTEN
>        3405 TIME_WAIT
>



-- 
BEKK Open
http://open.bekk.no

TesTcl - a unit test framework for iRules
http://testcl.com

Re: What is the relation between TIME_WAIT and HTTP Client calls to a RestService?

Posted by Michael Osipov <mi...@apache.org>.
Am 2015-06-04 um 17:51 schrieb Check Peck:
> I am using Spring RestTemplate to make a HTTP Calls to my RestService. I am
> using spring framework 3.1.1 version of RestTemplate. I cannot upgrade this
> since that's what we are using in our company.
>
> Now machine which is running my code (which uses RestTemplate) to make call
> to my RestService, I see lot of TIME_WAIT connections opened on that
> particular machine?
>
> - Is there any reason why it happens with RestTemplate or the way I am
> using it?
> - Also, what is the connection between TIME_WAIT and HTTP Client calls to
> my RestService? I am not able to understand this as well. Does HTTP Calls
> has any significance on TIME_WAIT? There might be some theoretical
> explanation for this I guess.
> [...]
> And here is netstat details on my box which is running my code to make HTTP
> Calls to my RestService. I am always seeing very high number of TIME_WAIT
> connections.
>
>           72 ESTABLISHED
>            2 FIN_WAIT1
>           17 LISTEN
>         3405 TIME_WAIT
>

This is rather a TCP issue. As far as I can see, Spring Web 3.1.x uses 
version 4.1 of HttpClient [1] and this one is unsupported. I do not know 
wether 4.4 is ABI compatible with 4.1 but you should update the 
HttpClient in your POM and retry, maybe your problem will go away.

I have found a quite good explanation about the issue you are 
experiencing [2], [3], it might be worth to discuss this with your admins.


Michael

[1] 
https://github.com/spring-projects/spring-framework/blob/3.1.x/org.springframework.web/ivy.xml#L63
[2] http://superuser.com/a/173542/222550
[3] http://www4.cs.fau.de/Projects/JX/Projects/TCP/tcpstate.html

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