On 02/14/2013 10:39 PM, Oleg Kalnichevski wrote:
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?
Many thanks Oleg, That works perfectly :) !
regards
asankha
--
Asankha C. Perera
AdroitLogic, http://adroitlogic.org
http://esbmagic.blogspot.com
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]