Hi, Should we rise a ticket about this issue?
thanks
2012/2/6 Hernan Sigliani <[email protected]>
> Probably a solution could be using the same lock object both in the
> continuation as in the synchronized blocks:
>
> @@ -334,9 +334,9 @@
> to = ((HttpComponent)
>
> getServiceUnit().getComponent()).getConfiguration().getConsumerProcessorSuspendTime();
> }
>
> - final Continuation continuation =
> ContinuationSupport.getContinuation(request, null);
> + final Object mutex = getOrCreateMutex(exchange);
> + final Continuation continuation =
> ContinuationSupport.getContinuation(request, mutex);
> exchange = (MessageExchange) continuation.getObject();
> - final Object mutex = getOrCreateMutex(exchange);
>
> // Synchronize on the mutex object while we're tinkering
> with the continuation object
> synchronized (mutex) {
>
> Please tell me what you think about that.
> Thanks,
>
> Hernán.
>
> On Fri, Feb 3, 2012 at 2:57 PM, Hernan Sigliani
> <[email protected]> wrote:
> > Hi,
> > I'm currently working on the testing of the compatibility of our
> > services developed for smx 3.3.2 on the new 3.4.0 platform, since we
> > are thinking upgrade to that version.
> > I found an issue in the http:consumer component (2011.02) that makes
> > all http requests get a timeout exception. That is not happening in
> > previous versions such as 2009.1.
> > The endpoint's declaration looks like this:
> >
> > <http:consumer service="b:http"
> > endpoint="endpoint"
> > targetService="b:xslt"
> > locationURI="http://0.0.0.0:8192/bridge/"
> > defaultMep="http://www.w3.org/2004/08/wsdl/in-out" />
> >
> > I think the problem is in this piece of code extracted from
> > org.apache.servicemix.http.endpoints.HttpConsumerEndpoint:
> >
> > 322: public void process(HttpServletRequest request,
> > HttpServletResponse response) throws Exception {
> > ...
> > 339: final Object mutex = getOrCreateMutex(exchange);
> > 340:
> > 341: // Synchronize on the mutex object while we're tinkering
> > with the continuation object
> > 342: synchronized (mutex) {
> > 343: if (isNewContinuation(continuation)) {
> > ...
> > 361: // Send the exchange and then suspend the HTTP
> > request until the message exchange gets answered
> > 362: send(exchange);
> > ...
> > 372: boolean istimeout = !continuation.suspend(to);
> > 373:
> > 374: // Continuation is being ended (either because the
> > message exchange was handled or the continuation timed out)
> > 375: // Cleaning up the stored objects for this
> continuation now
> > 376: exchange = doEndContinuation(continuation);
> > 377:
> > 378: // Throw exception when HTTP time-out has occurred
> > 379: if (istimeout) {
> > 380: throw new HttpTimeoutException(exchange);
> > 381: }
> > 382: }
> >
> > Here the continuation is suspended inside the synchorized block using
> > the exchange as lock object. By the other side, the release() is sent
> > to the continuation in the following method which processes the
> > exchange's result:
> >
> > 282: public void process(MessageExchange exchange) throws Exception {
> > 283: final String id = exchange.getExchangeId();
> > 283: final Object mutex = mutexes.get(id);
> > ...
> > 293: synchronized (mutex) {
> > 294: final Continuation continuation = continuations.get(id);
> > ...
> > 301: continuation.resume();
> > ...
> > 313: }
> >
> > The resume() method is called inside another synchrozed block using
> > the same object as lock, so the sequence is:
> > - lock over mutex starts
> > - continuation is suspended until its timeout
> > - lock over mutex ends
> > - the code inside the method which processes the exchange's result
> > gets control.
> > I think the point is that it always gets control after timeout occurs.
> > I made the tests on smx 3.3.2, http component 2009.01 (it works) and
> > on smx 3.4.0, http
> > component 2011.02 (timeout issue). In both cases I used the managed
> > servlet of the web distribution running on tomcat. The standalone
> > distribution using jetty connector work fine.
> >
> > Thanks in advance,
> > Hernan
>
--
Lic. Mario Matias Urbieta
[email protected]
www.fluxit.com.ar Calle 9 #865
La Plata / Buenos Aires / Argentina
+54 221 4831722 Int:308