[ 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.