jbossapache-cameljbossfusefuseesb

Deploy Fuse Camel Project on EAP


I build a simple Camel Project with a SOAP Web Service that writes a file and sends the response: it's packaged as bundle and I deployed it successfully on Karaf, you can find the source here

Firefox Send

Then I'd like to convert this project in a WAR module and deploy it on Fuse on EAP: following these instructions

Apache Camel: Tutorial on using Camel in a Web Application

I modified (in pom.xml) bundle -> war, I moved applicationContext.xml under src/main/webapp, and I created a web.xml with the Spring context loader: when I install the WAR I see (on server logs) that the Camel route is started but the SOAP WS isn't exposed

10:03:40,981 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Apache Camel 2.15.1 (CamelContext: camelId) is starting

10:03:40,994 INFO  [org.apache.camel.management.ManagedManagementStrategy] (ServerService Thread Pool -- 75) JMX is enabled

10:03:41,120 INFO  [org.apache.camel.impl.converter.DefaultTypeConverter] (ServerService Thread Pool -- 75) Loaded 197 type converters

10:03:41,339 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.

10:03:41,339 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html

10:03:41,370 INFO  [org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean] (ServerService Thread Pool -- 75) Creating Service {http://www.springframework.org/schema/beans}CamelHelloWorldService from WSDL: classpath:wsdl/Hello.wsdl

10:03:41,732 INFO  [org.apache.cxf.endpoint.ServerImpl] (ServerService Thread Pool -- 75) Setting the server's publish address to be /CamelHelloWorld

10:03:41,764 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Route: route2 started and consuming from: Endpoint[cxf://bean:helloWorldEndpointId]

10:03:41,764 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Total 1 routes, of which 1 is started.

10:03:41,764 INFO  [org.apache.camel.spring.SpringCamelContext] (ServerService Thread Pool -- 75) Apache Camel 2.15.1 (CamelContext: camelId) started in 0.783 seconds

10:03:41,764 INFO  [org.springframework.web.context.ContextLoader] (ServerService Thread Pool -- 75) Root WebApplicationContext: initialization completed in 2131 ms

10:03:41,826 INFO  [org.jboss.as.server] (HttpManagementService-threads - 2) JBAS015859: Deployed "camel-hello-world-0.0.21-SNAPSHOT.war" (runtime-name : "camel-hello-world-0.0.21-SNAPSHOT.war")

To be honest I see this exception too

10:03:39,711 WARN  [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] (ServerService Thread Pool -- 75) Ignored XML validation warning: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 419; SchemaLocation: schemaLocation value = ' http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd http://camel.apache.org/schema/cxf/camel-cxf-spring.xsd' must have even number of URI's.

at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:196)

at org.apache.xerces.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:97)

at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:386)

at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:322)

but I think it's only a warning.

Does anyone have any idea?

Thanks in advance


Solution

  • The 'must have even number of URI's' exception is because you have a superfluous entry for camel-cxf-spring.xsd at the end of the xsi:schemaLocation.

    You may find it better to base your code on the Camel Tomcat CXF example as it demonstrates how to set up CXFServlet in web.xml. You'll need this is you want the CXF consumer to work. E.g like this:

    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/webservices/*</url-pattern>
    </servlet-mapping>
    

    If you're using Fuse on EAP 7.0 or 7.1, you can avoid the Spring ContextLoaderListener and CXFServlet as the app server takes care of bootstrapping Spring & CXF for you. There's an example project here.