You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by "Willem Jiang (JIRA)" <ji...@apache.org> on 2011/09/25 15:36:26 UTC

[jira] [Commented] (CAMEL-3941) Camel-cxf dependencies problem as: jetty-7.3.1 is servlet-2.5 and cxf-2.4.0 is servlet-3.0 dependent

    [ https://issues.apache.org/jira/browse/CAMEL-3941?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13114257#comment-13114257 ] 

Willem Jiang commented on CAMEL-3941:
-------------------------------------

Another workaround is adding the synchronous option to be true on the camel-cxf endpoint like this.
{code}
from("cxf:xxx?synchronous=true")....
{code}



> Camel-cxf dependencies problem as: jetty-7.3.1 is servlet-2.5 and cxf-2.4.0 is servlet-3.0 dependent
> ----------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-3941
>                 URL: https://issues.apache.org/jira/browse/CAMEL-3941
>             Project: Camel
>          Issue Type: Bug
>          Components: build system, camel-cxf
>    Affects Versions: 2.8.0
>         Environment: Apache ServiceMix 4.4-SNAPSHOT
>            Reporter: Piotr Klimczak
>              Labels: camel, cxf, jetty, servlet, specification
>
> Probably because of this: https://issues.apache.org/jira/browse/CAMEL-3784 i have a problem with CXF dependencies in Camel as:
> 1. Camel 2.8 uses CXF 2.4.0 and Jetty 7.3.1
> 2. CXF 2.4.0 uses servlet 3.0
> 3. Jetty 7.x.x uses servlet 2.5
> Let's take a look at my example:
> {code:xml}
> <bean id="sampleBean" class="com.acme.Service" />
> <cxfEndpoint id="acmeService" address="/acmeService" serviceClass="#sampleBean" xmlns="http://camel.apache.org/schema/spring" />
> <camelContext id="testContext" trace="true" streamCache="false" xmlns="http://camel.apache.org/schema/spring" >
>     <route>
>         <from uri="cxf:bean:acmeService" />
>         <bean ref="sampleBean" />
>     </route>
> </camelContext>
> {code}
> Quite simple isn't it?
> But how come that we have Servlet spec version conflict? Let's take a look at class CXFConsumer of camel-cxf component:
> Around the lines 66 we have:
> {code}
> if (!endpoint.isSynchronous() && (continuation = getContinuation(cxfExchange)) != null) {
>     LOG.trace("Calling the Camel async processors.");
>     return asyncInvoke(cxfExchange, continuation);
> } else {
> {code}
> so if we use async API (set as default) it will try to pickup the Continuation as you can see around 111 line:
> {code}
> private Continuation getContinuation(Exchange cxfExchange) {
>     ContinuationProvider provider = 
>         (ContinuationProvider)cxfExchange.getInMessage().get(ContinuationProvider.class.getName());
>     return provider == null ? null : provider.getContinuation();
> }
> {code}
> The ContinuationProvider contains value of class Servlet3ContinuationProvider(cxf-rt-transports-http) which is Servlet 3.0 ready only!
> Let's go further to see what is happening in Servlet3Continuation(cxf-rt-transports-http) class:
> {code}
> HttpServletRequest req;
> //some code
> final AsyncContext context;
> //some code
> context = req.startAsync(req, resp);
> {code}
> If you take a closer look at AsyncContext class you will see that cxf 2.4.0 is expecting this class to be javax.servlet.AsyncContext type.
> BUT jetty 7 returns org.eclipse.jetty.server.AsyncContext which is incompatible.
> The worse thing is, that *req* value of type org.eclipse.jetty.server.Request that implements HttpServletRequest is expecting the HttpServletRequest to be 3.0 Servlet spec but is the 2.5 servlet spec one.
> All of this causes:
> {code}
> Caused by: java.lang.AbstractMethodError: org.eclipse.jetty.server.Request.startAsync(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)Ljavax/servlet/AsyncContext;
>         at org.apache.cxf.transport.http.Servlet3ContinuationProvider$Servlet3Continuation.<init>(Servlet3ContinuationProvider.java:77)[142:org.apache.cxf.bundle:2.4.0]
>         at org.apache.cxf.transport.http.Servlet3ContinuationProvider.getContinuation(Servlet3ContinuationProvider.java:58)[142:org.apache.cxf.bundle:2.4.0]
>         at org.apache.camel.component.cxf.CxfConsumer$1.getContinuation(CxfConsumer.java:114)[205:org.apache.camel.camel-cxf:2.8.0.SNAPSHOT]
>         at org.apache.camel.component.cxf.CxfConsumer$1.invoke(CxfConsumer.java:66)[205:org.apache.camel.camel-cxf:2.8.0.SNAPSHOT]
>         at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)[142:org.apache.cxf.bundle:2.4.0]
>         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)[:1.6.0_24]
>         at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)[:1.6.0_24]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:138)[:1.6.0_24]
>         at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)[142:org.apache.cxf.bundle:2.4.0]
>         at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106)[142:org.apache.cxf.bundle:2.4.0]
>         ... 34 more
> {code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira