Great! Thanks Oleg.

On 17/05/18 13:00, Oleg Kalnichevski wrote:
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


---------------------------------------------------------------------
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