First of all, you have to use the maven archetype servicemix-camel-service-unit to create add a tutorial-camel-su to your project. Check this page if you need help in running the archetype.

This archetype creates a service unit module with:

  • the correct <dependency/> already in place
  • a camel-context.xml file and an example of a RouteBuilder class

Afterwards, add the new service units to the service assembly by adding the necessary <dependency/> element to the SA's pom.xml. If you want, you can also change the <name/> to get a cleaner build log.

Configuring camel-context.xml

Apache Camel supports configuration through XML files, but for this tutorial we are going to use the Java Domain Specific Language. Modify your camel-context.xml file to point to the package containing the RouteBuilder classes as in the example below

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">

    <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
	<package>org.apache.servicemix.tutorial</package>
    </camelContext>

</beans>

Create your RouteBuilder

Now, create your own class to implement the Camel route and add this code to it:

package org.apache.servicemix.tutorial;

import javax.xml.transform.dom.DOMSource;

import org.apache.camel.builder.RouteBuilder;

/**
 * Camel Router for the ServiceMix tutorial
 *
 * @version $Revision: 1.1 $
 */
public class MyRouteBuilder extends RouteBuilder {

    public void configure() {
      from("jbi:service:urn:servicemix:tutorial:wiretap")
         .convertBodyTo(DOMSource.class)
         .to("jbi:endpoint:urn:servicemix:tutorial:jms:myQueue", "jbi:endpoint:urn:servicemix:tutorial:file:sender");
    }
}

Although the code pretty much speaks for itself, let us take a deeper look at it:

  • the from("jbi:service:urn:servicemix:tutorial:wiretap") defines the starting point of our route and creates a matching JBI endpoint that we can use from our other SUs (in our case, the tutorial-file-su refers to it)
  • by default, the normalized message sent by the <file:poller/> will contain a StreamSource and for now we need to convert our message body to DOMSource ourselves to ensure re-readability by both target endpoint – this step will disappear with our next release
  • the to("jbi:endpoint:urn:servicemix:tutorial:jms:myQueue", "jbi:endpoint:urn:servicemix:tutorial:file:sender") will send the message to both JBI endpoints mentioned

Build and deploy

If you use the instructions on this page to substitute for servicemix-eip on 2.6. Beginner - Exercise, you should now be able to build and deploy your SA. The build output should look something like this:

[INFO] Scanning for projects...
[INFO] Reactor build order: 
[INFO]   Tutorial
[INFO]   Tutorial :: File SU
[INFO]   Tutorial :: JMS SU
[INFO]   Tutorial :: Camel SU
[INFO]   Tutorial :: SA
       ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
       ...

Further reading