On Thu, 2013-02-14 at 22:24 +0530, Asankha C. Perera wrote:
> On 02/14/2013 09:03 PM, Oleg Kalnichevski wrote:
> > On Thu, 2013-02-14 at 16:11 +0530, Asankha C. Perera wrote:
> >> Hi All
> >>
> >> I was trying to use a custom connection pool implementation extending
> >> the BasicNIOConnPool for sending messages. My use case requires me to
> >> use different socket timeouts for different requests. When I want to
> >> send out messages, I do something like the following (code simplified
> >> for illustration)
> >>
> >> final BasicHttpContext coreContext = new BasicHttpContext();
> >> coreContext.setAttribute("timeout", 3000);
> >> asyncRequester.execute(requestProducer, responseConsumer,
> >> connectionPool, coreContext);
> >>
> >>
> >> My connection pool overrides the requestCompleted() method, and tries to
> >> read the socket timeout I had set earlier
> >>
> >> public class UltraNIOConnPool extends BasicNIOConnPool {
> >> protected void requestCompleted(SessionRequest request) {
> >> super.requestCompleted(request);
> >> Integer timeout = (Integer)
> >> request.getSession().getAttribute("timeout");
> >> if (timeout != null) {
> >> NHttpClientConnection conn = (NHttpClientConnection)
> >> request.getSession().getAttribute(ExecutionContext.HTTP_CONNECTION);
> >> conn.setSocketTimeout(timeout);
> >> }
> >> }
> >> }
> >>
> >> However, the values I put into the coreContext above is not available in
> >> the session within the requestCompleted(). I need to set the socket
> >> timeout before the new connection is used. I am quite sure I am
> >> overlooking something simpler.. so any help is very much appreciated
> >>
> >> regards
> >> asankha
> >>
> > Asankha
> >
> > A custom request interceptor should be a better place to do so. The
> > request interceptor will give you access to the right execution context
> > containing your custom attribute(s).
> >
> > Hope this helps
> >
> > Oleg
> Hi Oleg
>
> Do you mean overriding the
> HttpAsyncRequestExecutor.connected(NHttpClientConnection conn, Object
> attachment) method? That too does not have the context set..
>
> regards
> asankha
>
I was thinking about something like that:
---
final HttpParams params = new BasicHttpParams();
final HttpProcessor httpproc = new ImmutableHttpProcessor(new
HttpRequestInterceptor[] {
new HttpRequestInterceptor() {
@Override
public void process(
final HttpRequest request,
final HttpContext context) throws HttpException, IOException
{
final Integer timeout = (Integer)
context.getAttribute("timeout");
if (timeout != null) {
final NHttpClientConnection conn =
(NHttpClientConnection)
context.getAttribute(ExecutionContext.HTTP_CONNECTION);
conn.setSocketTimeout(timeout);
}
}
},
// Use standard client-side protocol interceptors
new RequestContent(),
new RequestTargetHost(),
new RequestConnControl(),
new RequestUserAgent(),
new RequestExpectContinue()});
final HttpAsyncRequester requester = new HttpAsyncRequester(
httpproc,
new DefaultConnectionReuseStrategy(),
params);
---
Would that do the trick for you?
Oleg
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]