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