[ 
https://issues.apache.org/jira/browse/CXF-2982?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12907215#action_12907215
 ] 

Willem Jiang commented on CXF-2982:
-----------------------------------

Before apply the patch, my camel-cxf consumer is like this

{code}
          private Object asyncInvoke(Exchange cxfExchange, final Continuation 
continuation) {
                if (continuation.isNew()) {
                    final org.apache.camel.Exchange camelExchange = 
perpareCamelExchange(cxfExchange);

                    // use the asynchronous API to process the exchange
                    boolean sync = getAsyncProcessor().process(camelExchange, 
new AsyncCallback() {
                        public void done(boolean doneSync) {
                            if (LOG.isTraceEnabled()) {
                                LOG.trace("Resuming continuation of exchangeId: 
"
                                          + camelExchange.getExchangeId());
                            }
                            // resume processing after both, sync and async 
callbacks
                            continuation.setObject(camelExchange);
                            continuation.resume();
                        }
                    });
                    // just need to avoid the continuation.resume is called
                    // before the continuation.suspend is called
                    if (continuation.getObject() != camelExchange && !sync) {
                        // Now we don't set up the timeout value
                        if (LOG.isTraceEnabled()) {
                            LOG.trace("Suspending continuation of exchangeId: "
                                      + camelExchange.getExchangeId());
                        }
                        // The continuation could be called before the suspend
                        // is called
                        continuation.suspend(0);
                    } else {
                        // just set the response back, as the invoking thread is
                        // not changed
                        if (LOG.isTraceEnabled()) {
                            LOG.trace("Processed the Exchange : " + 
camelExchange.getExchangeId());
                        }
                        setResponseBack(cxfExchange, camelExchange);
                    }

                }
                if (continuation.isResumed()) {
                    org.apache.camel.Exchange camelExchange = 
(org.apache.camel.Exchange)continuation
                        .getObject();
                    setResponseBack(cxfExchange, camelExchange);

                }
                return null;
            }
{code}

After applying the patch , my camel-cxf consumer code is much clearer
{code}
          private Object asyncInvoke(Exchange cxfExchange, final Continuation 
continuation) {
                if (continuation.isNew()) {
                    final org.apache.camel.Exchange camelExchange = 
perpareCamelExchange(cxfExchange);
                    // Now we don't set up the timeout value
                    if (LOG.isTraceEnabled()) {
                        LOG.trace("Suspending continuation of exchangeId: "
                                  + camelExchange.getExchangeId());
                    }
                    // now we could call the suspend here
                    continuation.suspend(0);
                    
                    // use the asynchronous API to process the exchange
                    getAsyncProcessor().process(camelExchange, new 
AsyncCallback() {
                        public void done(boolean doneSync) {
                            if (LOG.isTraceEnabled()) {
                                LOG.trace("Resuming continuation of exchangeId: 
"
                                          + camelExchange.getExchangeId());
                            }
                            // resume processing after both, sync and async 
callbacks
                            continuation.setObject(camelExchange);
                            continuation.resume();
                        }
                    });

                }
                if (continuation.isResumed()) {
                    org.apache.camel.Exchange camelExchange = 
(org.apache.camel.Exchange)continuation
                        .getObject();
                    setResponseBack(cxfExchange, camelExchange);

                }
                return null;
            }
{code}

> Don't throw the SuspendedInvocationException when call the suspend() method 
> of CXF continuation
> -----------------------------------------------------------------------------------------------
>
>                 Key: CXF-2982
>                 URL: https://issues.apache.org/jira/browse/CXF-2982
>             Project: CXF
>          Issue Type: Improvement
>            Reporter: Willem Jiang
>            Assignee: Willem Jiang
>             Fix For: 2.3
>
>         Attachments: cxf-2982.patch
>
>
> Current CXF Continuation suspend implementation is based on throw 
> SuspendedInvocationException, This  implementation has a shortcoming which 
> cannot call the other framework's  async API after continuation suspend is 
> called as Jetty7 does.
> So I introduce a flag of Message.CONTINUATION_SUSPENDED to break out current 
> interceptor chain as the SuspendedInvocation does,  but It will make CXF 
> continuation API more easy to use and it supports the Jetty7 continuation or 
> Servlet3  suspend resume semantics.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to