Uploaded image for project: 'Camel'
  1. Camel
  2. 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

    XMLWordPrintableJSON

Details

    Description

      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:

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

      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:

      if (!endpoint.isSynchronous() && (continuation = getContinuation(cxfExchange)) != null) {
          LOG.trace("Calling the Camel async processors.");
          return asyncInvoke(cxfExchange, continuation);
      } else {
      

      so if we use async API (set as default) it will try to pickup the Continuation as you can see around 111 line:

      private Continuation getContinuation(Exchange cxfExchange) {
          ContinuationProvider provider = 
              (ContinuationProvider)cxfExchange.getInMessage().get(ContinuationProvider.class.getName());
          return provider == null ? null : provider.getContinuation();
      }
      

      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:

      HttpServletRequest req;
      //some code
      final AsyncContext context;
      //some code
      context = req.startAsync(req, resp);
      

      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:

      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
      

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              nannou9 Piotr Klimczak
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: