Introduction to Apache Camel

Apache
 Camel is a open source implementation of famous Enterprise Integration 
Patterns.   Camel is a Routing and Mediation Engine and facilitates the 
developers to create routes and mediation rules in variety of Domain 
Specific language(DSL) such as java, Spring/XML, scala etc.
Camel is versatile
Camel
 uses URIs to supports large number of transport and messaging models 
such as HTTP, JMS, JBI, Mina, SCA, CXF  it also  works well with 
external components and dataformats. To get a  feel of versatility of 
Camel you can browse the list of Components and URIs it supports in the 
link below. http://camel.apache.org/components.html
Camel is easy to use
Camel
 allows us to use same set of APIs to create routes and mediate messages
 between various components. This makes it extremely easy to use
Unit Testing camel is a breeze
Unit
 testing is essential to writing any quality code. Camel makes this 
facade of software development extremely easy. It provides bunch of 
ready make components like CamelContextSupport,  camel-guice, 
camel-test-blueprint for easily testing the code. More of this in a 
future post.
The Camel Terminologies/Classes/Interfaces
Endpoint
Endpoints
 are places where the exchange of messages takes place. It may refer to 
an address, a POJO, email address, webservice uri, queue uri, file etc. 
In camel an endpoint is implemented by implemented Endpoint interface. 
The endpoints are wrapped by something called routes.
CamelContext
CamelContext is at heart of all camel application and it represents Camel run time system.
Create camelcontext.
Add endpoints or components.
Add Routes to connect the endpoints.
Invoke
 camelcontext.start() – This starts all the camel-internal threads which
 are responsible for receiving, sending and processing messages in the 
endpoints.
Lastly invoking camelcontext.stop() when all the 
messages are exchanged and processed. This will gracefully stop all the 
camel-internal threads and endpoints.
CamelTemplate
This is a thin wrapper around the CamelContext object and it is responsible to sending exchange or messages to an endpoint.
Component
Component
 is really an endpoint factory. As camel supports lots of different kind
 of resources, each of these resources have different kind of endpoints.
 In practical cases application don’t create endpoints directly using 
Components. Instead CamelContext decideds which component to instantiate
 and then uses that component instance to create endpoints. So in app we
 will have. 
CamelContext.getEndpoint(“pop3://john.smith@mailserv.example.com?password=myPassword”);
 Now pop3 in this case is name of the component. CamelContext maps all 
the component name with the component classes and using the name it 
instantiates the instance. Once it has handle to the component it 
instantiates the endpoint by calling. Component.createInstance() method.
Message
Mesaage
 represents a single concrete message ie request, reply or exception. 
All concrete message class impements a message interface for example 
JmsMessage class.
Exchange
Exchange is a container of message. It is created when a message is received by a consumer during routing process.
Processor
Processor
 interface represents a class that processes a message. It contains a 
single method public void process(Exchange exchange) throws exception 
Application developers can implement this interface to preform business 
logic on the message when message is received by the consumer.
Routes and RouteBuilder
Route
 is the step by step movement of message from a source, through 
arbitrary types of decision by filters or routers to a destination. They
 are configured by help of DSL (Domain Specific language). Java DSL is 
created by implementing routebuilder interface. It has single method 
called configure() which defines the entire route of message. Routes can
 also be configured via xml file using spring.
A Small Example of Camel code.
Lets
 follow this with a small example to get a taste of what Camel can do. 
In this example we will move group of files present in a folder to a 
different folder. In this process we will do following
Checkout the dependencies for Camel.
Create a simple RouterBuilder.
Registering CamelContext in a spring file.
Injecting the routerbuilder in a the CamelContext Bean
Executing the class by starting the Camelcontext and finally stopping it once the execution is done.
1. Dependencies – Add following dependencies in your pom.xml
01
02
            org.apache.camel
03
            camel-core
04
            ${camel-version}
05
06
07
08
            org.apache.camel
09
            camel-spring
10
            ${camel-version}
11
12
13
14
            org.apache.camel
15
            camel-aws
16
            ${camel-version}
17
2.
 Create RouterBuilder - RouterBuilder can be created by extending 
org.apache.camel.builder.RouterBuilder class and overriding configure() 
method. Here is an example
01
import org.apache.camel.builder.RouteBuilder;
02
03
/**
04
 * Created by IntelliJ IDEA.
05
 * User: Niraj Singh
06
 * Date: 7/28/13
07
 * Time: 10:29 AM
08
 * To change this template use File | Settings | File Templates.
09
 */
10
public class MyFirstRouterBuilder extends RouteBuilder {
11
     @Override
12
    public void configure() throws Exception {
13
        try{
14
            from( "file:d:/vids").to("file:d:/temp");
15
        }catch(Exception e){
16
17
        }
18
     }
19
}
From() is the source endpoint and contains uri of file or directory which camel will be polling.
to() represents the target endpoint and contains name of target file or directory.
The file component uri is of form “file://nameOfFileOrDirectory“.
3. Registering CamelContext in spring and injecting RouterBuilder in spring.
01
02
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
03
       xsi:schemaLocation="
04
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
05
          http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
06
07
08
09
10
11
12
13
4. Starting the camel context and executing the code and stopping the camel context.
01
import org.apache.camel.CamelContext;
02
import org.springframework.context.ApplicationContext;
03
import org.springframework.context.support.FileSystemXmlApplicationContext;
04
05
/**
06
 * Created by IntelliJ IDEA.
07
 * User: Niraj Singh
08
 * Date: 4/16/13
09
 * Time: 11:21 AM
10
 * To change this template use File | Settings | File Templates.
11
 */
12
public class CamelHello {
13
    public static void main(String args[]) throws Exception {
14
        try {
15
 
               ApplicationContext springcontext = new 
FileSystemXmlApplicationContext("D:/samayik/awsdemo/src/main/resources/hellocamel.xml");
16
                CamelContext context = springcontext.getBean("firstCamelContext", CamelContext.class);
17
                context.start();
18
                Thread.sleep(10000);
19
                context.stop();
20
21
            } catch ( Exception e ) {
22
                System.out.println(e);
23
            }
24
25
    }
26
}
If
 you run this class then first we load the camelcontext from the spring 
config file. Inject the router builder in it. After the context starts 
then all the file from source directory is copied to the target 
directory. Once all the file are copied then try copying a new file to 
the source directory, it will be copied to target as well until the 
context is running 10000 ms in this case.
I 
have few more advanced tutorials on camel. Perhaps you will find them 
useful. There links are listed in the reference sections.
References
http://camel.apache.org/
http://camel.apache.org/enterprise-integration-patterns.html
http://architects.dzone.com/articles/enterprise-integration
http://weblog4j.com/2013/05/14/amazon-sqs-listening-to-sqs-using-apache-camel-the-spring-dsl-way/
http://weblog4j.com/2013/04/17/amazon-sqs-listening-to-amazon-sqs-queue-using-apache-camel/
That
 is all folks. Though no one will write comments, but I like to 
persevere, and still request folks to drop in a line or two if you like 
this tutorial. 
Warm Regards
Harry
 
No comments:
Post a Comment