Hi

I'd like to continue the discussion on how to handle Jetty continuations[1] in 
CXF[2] here.

In short the requirement is for CXF to be able to handle the application code 
(ServiceMix JBI consumers served by ServiceMix CXF BindingComponent in this 
case) doing explicit continuations.

Ex. CXF receives a request on a Jetty thread, creates an exchange and sends it 
further along to the consumer. Consumer is about to do some work so it spawns 
some activity or checks for some event and then does continuation.suspend(). 
This results in a specific Runtime exception being thrown. 

The challenge is how to 'suspend' the interception chain, let this exception 
propagate down to the Jetty stack so that it can free the thread and put this 
pending request in its internal queue, and then resume it when a consumer code 
decides to do continuation.resume().

See [3] for a more detailed description of the issues.

Dan, here're some comments :

1. "something would need to be done to allow the "suspend" exception thing to 
propogate up, 
but without taking a jetty dependency into the core."

I guess the basic thing we can do is to check the class name of the exception 
(like exception.getClass().equals("JettyException")), and if it matches the 
expected name then we can wrap up this exception in a SuspendedFault exception, 
to be recognized by the rest of CXF runtime

2. Now, if the above can be figured out, the next problem arises: when 
the "trigger" to wake up the continuation occurs

I think we can can do in JettyDestination omething similar to what is done in 
SMX. When getting a SuspendedFault exception, we can extract from it the 
original continuation instance or else we can do 
ContinuationSupport.getContinuation(request) which should return us the 
instance. At this point we can use it as a ket to store the current exchange 
plus all the other info we may need.

When the user/application code does continuation.resume(), the Jetty thread 
will come back and we will use the ContinuationSupport.getContinuation(request) 
to get us the active continuation and use it to extract the suspended exchange 
and proceed from there, say we'll call PhaseInterceptorPhase.resume(), etc, 
something along the lines you suggested

 
3. Basically, to do this "right", we'd need to audit pretty much everything to 
make sure nothing is stored on the stack and is "resumable". Once that is 
done, the rest is relatively easy. 

Yea - probably can be the quite challenging


Thoughts ?

Cheers, Sergey




[1] http://docs.codehaus.org/display/JETTY/Continuations
[2] https://issues.apache.org/jira/browse/CXF-1835
[3] 
https://issues.apache.org/jira/browse/CXF-1835?focusedCommentId=12642361#action_12642361

Reply via email to