On Thu, 2018-05-17 at 02:21 +0300, / wrote:
> Thanks I understand.
> 
> I would appreciate if some concrete code or pointer to examples is
> given 
> regarding:
> 
> 1) Create a shared HTTPClient
> 2) how a given thread is passed=given the shared client and changes, 
> say, connection timeout AND ALSO its userAgentString.
> 
> (the userAgentString is not something I want to change but I try to
> push 
> this to its limit).
> 

I tweaked the ClientMultiThreadedExecution example a little. Hope this
helps.

Oleg

---
public class ClientMultiThreadedExecution {

    public static void main(String[] args) throws Exception {
        // Create an HttpClient with the ThreadSafeClientConnManager.
        // This connection manager must be used if more than one thread will
        // be using the HttpClient.
        PoolingHttpClientConnectionManager cm = new 
PoolingHttpClientConnectionManager();
        cm.setMaxTotal(100);

        CloseableHttpClient httpclient = HttpClients.custom()
                .setUserAgent(null)
                .addInterceptorLast(new HttpRequestInterceptor() {
                    @Override
                    public void process(
                            HttpRequest request,
                            HttpContext context) throws HttpException, 
IOException {
                        final String userAgent = (String) 
context.getAttribute("user-agent");
                        if (userAgent != null) {
                            request.addHeader(HTTP.USER_AGENT, userAgent);
                        }

                    }
                })
                .setConnectionManager(cm)
                .build();
        try {
            // create an array of URIs to perform GETs on
            String[] urisToGet = {
                "http://hc.apache.org/";,
                "http://hc.apache.org/httpcomponents-core-ga/";,
                "http://hc.apache.org/httpcomponents-client-ga/";,
            };

            // create a thread for each URI
            GetThread[] threads = new GetThread[urisToGet.length];
            for (int i = 0; i < threads.length; i++) {
                HttpGet httpget = new HttpGet(urisToGet[i]);

                HttpClientContext clientContext = HttpClientContext.create();
                clientContext.setRequestConfig(RequestConfig.custom()
                        .setSocketTimeout(500 * i)
                        .build());
                clientContext.setAttribute("user-agent", "My-User-Agent-" + (i 
+ 1));

                threads[i] = new GetThread(httpclient, clientContext, httpget, 
i + 1);
            }

            // start the threads
            for (int j = 0; j < threads.length; j++) {
                threads[j].start();
            }

            // join the threads
            for (int j = 0; j < threads.length; j++) {
                threads[j].join();
            }

        } finally {
            httpclient.close();
        }
    }

    /**
     * A thread that performs a GET.
     */
    static class GetThread extends Thread {

        private final CloseableHttpClient httpClient;
        private final HttpClientContext context;
        private final HttpGet httpget;
        private final int id;

        public GetThread(CloseableHttpClient httpClient, HttpClientContext 
context, HttpGet httpget, int id) {
            this.httpClient = httpClient;
            this.context = context;
            this.httpget = httpget;
            this.id = id;
        }

        /**
         * Executes the GetMethod and prints some status information.
         */
        @Override
        public void run() {
            try {
                System.out.println(id + " - about to get something from " + 
httpget.getURI());
                CloseableHttpResponse response = httpClient.execute(httpget, 
context);
                try {
                    System.out.println(id + " - get executed");
                    // get the response body as an array of bytes
                    HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        byte[] bytes = EntityUtils.toByteArray(entity);
                        System.out.println(id + " - " + bytes.length + " bytes 
read");
                    }
                } finally {
                    response.close();
                }
            } catch (Exception e) {
                System.out.println(id + " - error: " + e);
            }
        }

    }

}
---


> bw
> a.
> 
> On 16/05/18 22:54, Oleg Kalnichevski wrote:
> > On Wed, 2018-05-16 at 15:56 +0000, Daly, Paul wrote:
> > > I canot speak for HttpClient5, but If you are just looking to
> > > change
> > > some timeouts on the request, in 4.5.5, I do this (as recommended
> > > from this emai list some time ago!).
> > > 
> > > I guess its not too differenent for HC5 (?)
> > > 
> > > 
> > > - Create a shared HTTPClient instance. this is used by all
> > > requests
> > > in the JVM and is instantiated on first use.
> > > - each request (thread) grabs the shared client (it is thread
> > > safe)
> > > - each request (thread) creates its own request context
> > > - set the request type specific timeout on the request context
> > > (note
> > > internally in our app we apply different timeouts depending on
> > > several factors (message type,client etc))
> > > - execute the request on the shared client with the request
> > > context
> > > 
> > > Seems to work fine...
> > > 
> > 
> > +1. Precisely how it was intended.
> > 
> > Oleg
> > 
> > > Some snippets
> > > 
> > > // in a client factory class I create the client based on
> > > sensible
> > > timeout defaults
> > > // this populates a static httpclient which can be returned by a
> > > static getClient method to all threads needing a httpClient
> > > CloseableHttpClient newClient =
> > > HttpClientBuilder.create().useSystemProperties()
> > >           .setDefaultRequestConfig(config).setMaxConnPerRoute(max
> > > ConnectionsPerRoute)
> > >           .setMaxConnTotal(totalMaxConnection).evictExpiredConnec
> > > tions()
> > >           .evictIdleConnections(idleLife,
> > > TimeUnit.MINUTES).setConnectionTimeToLive(maxLife,
> > > TimeUnit.MINUTES)
> > >           .build();
> > > 
> > > 
> > > statichttpClient = newClient;
> > > 
> > > 
> > > // within the request
> > > httpClient = HttpClientFactory.getClient();
> > > 
> > > // create the context for this thread
> > > HttpClientContext httpContext = HttpClientContext.create();
> > > httpContext.setRequestConfig(getRequestConfig());
> > > HttpResponse serviceResponse = httpClient.execute(httpRequest,
> > > httpContext);
> > > 
> > > 
> > > // make the request config
> > > private RequestConfig getRequestConfig() throws
> > > PCEConfigParamNotFoundException {
> > > 
> > > // setup request timeouts
> > > return RequestConfig.custom().setConnectionRequestTimeout(aaa).
> > > setConnectTimeout(bbb). setSocketTimeout(ccc).build();
> > > }
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > -----Original Message-----
> > > From: / [mailto:isla...@yahoo.co.uk.INVALID]
> > > Sent: Wednesday, May 16, 2018 4:01 PM
> > > To: httpclient-users@hc.apache.org
> > > Subject: Re: Fwd: HttpClient5 : simple example on how to
> > > configure
> > > timeout after build()
> > > 
> > > Thanks,
> > > 
> > > if I understood correctly, the pattern should be:
> > > 
> > > 1) Create a RequestConfig (rc) object and keep it.
> > > 2) If you need to modify httpclient, modify the kept
> > > RequestConfig
> > > object
> > > 3) After doing said modifications **re-create httpclient** with
> > > kept
> > > RequestConfig.
> > > 4) Keep the RequestConfig.
> > > 5) Keeping a client and modifying it as see fit is/will be
> > > deprecated.
> > > 
> > > Questions:
> > > can I extract a RequestConfig from current client, modify its
> > > timeout
> > > and then re-create a client with this cloned-and-modified
> > > RequestConfig?
> > > (so as not to keep a RequestConfig at all but remember all the
> > > settings
> > > I did to my client).
> > > 
> > > 
> > > 
> > > thanks
> > > 
> > > On 16/05/18 17:42, Shawn Heisey wrote:
> > > > On 5/16/2018 8:09 AM, / wrote:
> > > > > I am looking for an example on how to configure HttpClient5
> > > > > after
> > > > > it
> > > > > has been built and how to extract/print some of its
> > > > > configuration.
> > > > > 
> > > > > Once I have an HttpClient object, how do I go about and
> > > > > change
> > > > > some of
> > > > > its settings, for example connection timeout or user-agent-
> > > > > string
> > > > > or
> > > > > even cookie jar?
> > > > > 
> > > > > I am looking for the most straight-forward and efficient way
> > > > > to
> > > > > do
> > > > > this. I don't care about "fluent" APIs neither about streams
> > > > > etc.
> > > > > 
> > > > > something like:
> > > > > 
> > > > > myclient.setParameter(connection_timeout, 1000);
> > > > 
> > > > For the most part, you can't change settings on an existing
> > > > HttpClient
> > > > object.  Since about 4.3, the objects and methods that allow
> > > > clients to
> > > > be changed after creation are all deprecated. That capability
> > > > is
> > > > completely gone in 5.x.  Default settings are managed with
> > > > builder
> > > > objects using fluent methods, then you create the client object
> > > > with the
> > > > indicated settings.  Here's how I create a client object with
> > > > explicit
> > > > defaults using non-deprecated code in the 4.5 version:
> > > > 
> > > >     RequestConfig rc =
> > > > RequestConfig.custom().setConnectTimeout(15000)
> > > >             .setSocketTimeout(120000).build();
> > > >     httpClient =
> > > > HttpClients.custom().setDefaultRequestConfig(rc)
> > > > .setMaxConnPerRoute(300).setMaxConnTotal(5000).disableAutomatic
> > > > Retr
> > > > ies()
> > > >             .build();
> > > > 
> > > > The httpClient field is an instance of HttpClient.  I do not
> > > > know
> > > > what
> > > > kind of adjustments might need to be made for 5.x, but that
> > > > should
> > > > give
> > > > you an idea about how things are done since the way you're
> > > > trying
> > > > to do
> > > > it is no longer available.
> > > > 
> > > > Many of the settings you might be interested in can also be
> > > > changed
> > > > at
> > > > the request level.  I do not know HOW to do this, only that it
> > > > CAN
> > > > be
> > > > done.  I think this is what Oleg was referring to in his reply.
> > > > 
> > > > Thanks,
> > > > Shawn
> > > > 
> > > > 
> > > > -------------------------------------------------------------
> > > > ----
> > > > ----
> > > > To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.
> > > > org
> > > > For additional commands, e-mail: httpclient-users-help@hc.apach
> > > > e.or
> > > > g
> > > > 
> > > 
> > > ---------------------------------------------------------------
> > > ------
> > > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.or
> > > g
> > > For additional commands, e-mail: httpclient-users-help@hc.apache.
> > > org
> > > 
> > > 
> > > ---------------------------------------------------------------
> > > ------
> > > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.or
> > > g
> > > For additional commands, e-mail: httpclient-users-help@hc.apache.
> > > org
> > > 
> > 
> > -----------------------------------------------------------------
> > ----
> > To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
> > For additional commands, e-mail: httpclient-users-h...@hc.apache.or
> > g
> > 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
> For additional commands, e-mail: httpclient-users-h...@hc.apache.org
> 

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

Reply via email to