Agreed. Especially if continuations can be supported somehow on the
JMS transport, ServiceMix should not depend on the jetty internal
continuations.

On Wed, Nov 12, 2008 at 1:08 PM, Freeman Fang <[EMAIL PROTECTED]> wrote:
> Sergey Beryozkin wrote:
>>>>
>>>> So before a suspended runtime exception reaches the nearest catch block
>>>> in
>>>> the CXF code where we can get a chance to do something to preserve the
>>>> state
>>>> of the given invocation, resume() might've alreadty occurred.
>>>
>>> That's why you need some synchronization blocks to ensure resume can
>>> not be called before suspend has been handled somehow.
>>> I would suggest wrapping the jetty continuation into something more
>>> CXF specific which could be used for other transports too.
>>
>> Yes, I think we're on the same page here. Case 2 is exactly about the user
>> code interacting with the
>> (jetty - when http is involved) continuations indirectly. But I think we
>> agree that if a user code does suspend on an underlying jetty continuation
>> object directly then a race condition leading to a 'loss' of message might
>> occur if resume() is done in parallel, virtually immediately after suspend()
>> was called.
>>
>> Question : how will SMX CXF Binding Component interact with (Jetty)
>> continuations when dealing with CXF-originated invocations ? The
>> Continuation wrappers will be available through an internal CXF input
>> Message and through JAXWS WebServiceContext (or JAXRS one later on) - will
>> CXF BC be able to get hold of such wrappers  ? If yes then I guess we have
>> no problems at all ?
>>
> Yes, I think so, get continuation from cxf message
> (org.apache.cxf.message.Message) is fine for CxfBcConsumer.
>>>
>>> Whoever calls the suspend() does not really matter here.
>>> The problem is that suspending the continuation will trigger a timer in
>>> jetty.
>>> When this timer elapse, the request will be replayed with a flag on
>>> the continuation
>>> saying it has been timed out somehow (we check the cont.isPending()
>>> flag in smx).
>>> At this point, you need to ensure that the timeout will be handled
>>> correctly both on the
>>> http response side, and on the cxf message side.
>>>
>>
>> I'm feeling silly :-) as I don't get it.
>>
>> Input :
>>
>> 1. What CXF JettyDestination can do if it finds out that a continuation
>> with say 'resumed' status, which is what I see in case1 as I described
>> earlier has no message associated with it ?
>>
>> 2. Why it should care about the suspended/resumed status of the
>> continuation when its *isNew()* call returns *false* ?
>> If it has a message attached to it then what difference would it make for
>> the resumed invocation whether this invocation has been resumed due to that
>> continuation being resumed explicitly or timed out ? I honestly see no
>> difference
>>
>> Output :
>>
>> I don't so anything at all on the Jetty Destination output, as far as
>> continuations are concerned. Some code down the line calls cont.resume() or
>> this continuation expired, in both cases the request is retried by Jetty
>> (that's the inbound path). If the existing message is found on the incoming
>> http request's continuatiuon - we resume a paused invocation otherwise we
>> start a new one. As I said - we might throw an exception at this point if we
>> find that the not-new continuation has no message attached to it - logging a
>> warning for now.
>>
>> Either way, eventually this invocation returns. Why should we do anything
>> about the fact at this stage that this invocation was 'resumed' by the timer
>> expiring ?
>>
>> Am I totally slow ?
>>
>> Cheers, Sergey
>>
>
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to