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:[email protected]]
> > > Sent: Wednesday, May 16, 2018 4:01 PM
> > > To: [email protected]
> > > 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: [email protected].
> > > > org
> > > > For additional commands, e-mail: [email protected]
> > > > e.or
> > > > g
> > > >
> > >
> > > ---------------------------------------------------------------
> > > ------
> > > To unsubscribe, e-mail: [email protected]
> > > g
> > > For additional commands, e-mail: [email protected].
> > > org
> > >
> > >
> > > ---------------------------------------------------------------
> > > ------
> > > To unsubscribe, e-mail: [email protected]
> > > g
> > > For additional commands, e-mail: [email protected].
> > > org
> > >
> >
> > -----------------------------------------------------------------
> > ----
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> > g
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]