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 <[email protected]> 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ø <
> > [email protected]> 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 <[email protected]>:
> > >
> > > > 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: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to