KEMBAR78
Apache Camel - The integration library | PDF
Apache Camel
The Integration Library
@davsclaus
davsclaus
davsclaus.com
Claus Ibsen
Claus Ibsen
• Principal Software Engineer

at Red Hat
• Apache Camel

8 years working with Camel
• Author of

Camel in Action books
@davsclaus
davsclaus
davsclaus.com
Agenda
• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• Running Camel
• More Information
What is Apache Camel?
• Quote from the website
Apache Camel is a
powerful Open Source
Integration Framework
based on
Enterprise Integration Patterns
What is Apache Camel?
• Quote from the website
Apache Camel is a
powerful Open Source
Integration Framework
based on
Enterprise Integration Patterns
Integration Framework
Enterprise Integration
Patterns
Enterprise Integration
Patterns
Content Based Router
Content Based Router
from newOrder
Content Based Router
from newOrder
choice
Content Based Router
from newOrder
choice
when isWidget to widget
Content Based Router
from newOrder
choice
when isWidget to widget
otherwise to gadget
Content Based Router
from(newOrder)
choice
when(isWidget) to(widget)
otherwise to(gadget)
Content Based Router
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
Content Based Router
Endpoint newOrder = endpoint("activemq:queue:newOrder");
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
Content Based Router
Endpoint newOrder = endpoint("activemq:queue:newOrder");
Predicate isWidget = xpath("/order/product = 'widget'");
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
Content Based Router
Endpoint newOrder = endpoint("activemq:queue:newOrder");
Predicate isWidget = xpath("/order/product = 'widget'");
Endpoint widget = endpoint("activemq:queue:widget");
Endpoint gadget = endpoint("activemq:queue:gadget");
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
Java Code
public void configure() throws Exception {
Endpoint newOrder = endpoint("activemq:queue:newOrder");
Predicate isWidget = xpath("/order/product = 'widget'");
Endpoint widget = endpoint("activemq:queue:widget");
Endpoint gadget = endpoint("activemq:queue:gadget");
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
}
Java Code
import org.apache.camel.Endpoint;
import org.apache.camel.Predicate;
import org.apache.camel.builder.RouteBuilder;
public class MyRoute extends RouteBuilder {
public void configure() throws Exception {
Endpoint newOrder = endpoint("activemq:queue:newOrder");
Predicate isWidget = xpath("/order/product = 'widget'");
Endpoint widget = endpoint("activemq:queue:widget");
Endpoint gadget = endpoint("activemq:queue:gadget");
from(newOrder)
.choice()
.when(isWidget).to(widget)
.otherwise().to(gadget);
}
}
Java DSL
import org.apache.camel.builder.RouteBuilder;
public class MyRoute extends RouteBuilder {
public void configure() throws Exception {
from("activemq:queue:newOrder")
.choice()
.when(xpath("/order/product = 'widget'"))
.to("activemq:queue:widget")
.otherwise()
.to("activemq:queue:gadget");
}
}
XML DSL
<route>
<from uri="activemq:queue:newOrder"/>
<choice>
<when>
<xpath>/order/product = 'widget'</xpath>
<to uri="activemq:queue:widget"/>
</when>
<otherwise>
<to uri="activemq:queue:gadget"/>
</otherwise>
</choice>
</route>
Endpoint URIs
<route>
<from uri="file:inbox/orders"/>
<choice>
<when>
<xpath>/order/product = 'widget'</xpath>
<to uri="activemq:queue:widget"/>
</when>
<otherwise>
<to uri="activemq:queue:gadget"/>
</otherwise>
</choice>
</route>
Use file instead
Endpoint URIs
<route>
<from uri="file:inbox/orders?delete=true"/>
<choice>
<when>
<xpath>/order/product = 'widget'</xpath>
<to uri="activemq:queue:widget"/>
</when>
<otherwise>
<to uri="activemq:queue:gadget"/>
</otherwise>
</choice>
</route>
Parameters
Just Java Code
Just XML
Architecture
Components
ahc bindy coap docker
ahc-ws blueprint cometd dozer
apns boon context dropbox
atmosphere box couchdb eclipse
atom cache crypto ejb
aws cassandraql csv elasticsearch
bam castor cfx elsql
bean-validator cdi cxf-transport eventadmin
beanio chunk disruptor exec
beanstalk cmis dns facebook
Components
flatpack google-drive hbase jacksonxml
fop google-mail hdfs jasypt
freemarker gora hdfs2 javaspace
ftp grape http jaxb
gae groovy http4 jbpm
ganglia gson ibatis jclouds
geocoder guava-eventbus ical jcr
git guice infinispan jdbc
github hawtdb irc jetty8
google-calendar hazelcast jackson jetty9
Components
jgroups jsonpath leveldb mustache
jibx jt400 linkedin mvel
jing juel lucene mybatis
jira jxpath mail netty
jms kafka metrics netty-http
jmx kestrel mina netty4
jolt krati mina2 netty4-http
josql kubernetes mongodb ognl
jpa kura mqtt olingo2
jsch ldap msv openshift
Components
optaplanner rabbitmq scala smpp
paho restlet schematron snpp
paxlogging rmi scr soap
pdf routebox script solr
pgevent rss servlet spark-rest
printer ruby servletlistener spring
protobuf rx shiro spring-batch
quartz salesforce sip spring-boot
quarz2 sap-netweaver sjms spring-integration
quickfix saxon slack spring-javaconfig
Components
spring-ldap swagger undertow xmlsecurity
spring-redis swagger-java univocity xmpp
spring-security syslog urlrewrite xstream
spring-ws tagsoup velocity yammer
sql tarfile vertx zipfile
ssh test weather zookeeper
stax test-blueprint websocket
stomp test-spring xmlbeans
stream testng xmljson
stringtemplate twitter xmlrpc
+
+
+
+
+
+
+
+
+ =
Apache Camel 1.0
Apache Camel 2.17.3
Pop Quizz
How long time between
the first
and
the latest
release ?
Pop Quizz
9 years
Agenda
• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• Running Camel
• More Information
File Copier Example
Public Static Void Main
Create CamelContext
Add RouteBuilder
Java DSL
Start / Stop
Camel Main
Agenda
• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• Running Camel
• More Information
Trying Camel
• Download Apache Camel 2.17.3
• tar xf apache-camel-2.17.3.tar.gz
• cd apache-camel-2.17.3
• cd examples
read readme.md first
Beginner Example
• camel-example-console
mvn camel:run
Run with web console
mvn io.hawt:hawtio-maven-plugin:1.4.65:camel
http://hawt.io/maven
Spring Boot Starter
WildFly Swarm Generator
Agenda
• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• More Information
What's in the Camel Box?
Enterprise Integration
Patterns
http://camel.apache.org/eip
Pipes and Filters EIP
from("file:inbox")
.pipeline()
.to("bean:decrypt")
.to("bean:authenticate")
.to("bean:de-dup");
Pipes and Filters EIP
from("file:inbox")
.to("bean:decrypt")
.to("bean:authenticate")
.to("bean:de-dup");
pipeline is default mode so its

nearly always omitted
Recipient List
from("restlet:http://localhost:9080

/stocks/{symbol}?restletMethods=post")
.recipientList(simple("activemq:queue:${header.symbol}"));
curl -X POST -d "120" "http://localhost:9080/stock/ORCL"
Recipient List
from("restlet:http://localhost:9080

/stocks/{symbol}?restletMethods=post")
.recipientList(simple("activemq:queue:${header.symbol}"));
curl -X POST -d "120" "http://localhost:9080/stock/ORCL"
Recipient List
from("restlet:http://localhost:9080

/stocks/{symbol}?restletMethods=post")
.toD("activemq:queue:${header.symbol}"));
much easier now with toD

(to dynamic)
curl -X POST -d "120" "http://localhost:9080/stock/ORCL"
Recipient List
restConfiguration().component("restlet").port(9080);

rest("stocks")
.post("{symbol}")
.toD("activemq:queue:${header.symbol}"));
and use
rest-dsl
curl -X POST -d "120" "http://localhost:9080/stock/ORCL"
Splitter
Splitter
from("file:inbox")
Splitter
from("file:inbox")
.split(body().tokenize("n"))
Splitter
from("file:inbox")
.split(body().tokenize("n"))
.marshal(customToXml)
Custom Data
Format
Splitter
from("file:inbox")
.split(body().tokenize("n"))
.marshal(customToXml)
.to("activemq:line");
Custom Data
Format
Components
ahc bindy coap docker
ahc-ws blueprint cometd dozer
apns boon context dropbox
atmosphere box couchdb eclipse
atom cache crypto ejb
aws cassandraql csv elasticsearch
bam castor cfx elsql
bean-validator cdi cxf-transport eventadmin
beanio chunk disruptor exec
beanstalk cmis dns facebook
camel-catalog:component-list | wc -l
218
Data Formats
avro flatpack pgp univocity-fixed
barcode gzip protobuf univocity-tsv
base64 hl7 rss xmlBeans
beanio ical secureXML xmjson
bindy-csv jacksonxml serialization xmlrpc
bindy-fixed jaxb soapjaxb xstream
bindy-kvp jibx string zip
boon json-gson syslog zipfile
castor json-jackson tarfile
crypto json-xstream tidyMarkup
csv mime-multipart univocity-csv
camel-catalog:dataformat-list | wc -l
47
Data Format with JAXB
• POJO class with @JAXB annotations
Data Format with JAXB
• marshal (xml -> pojo)
• unmarshal (pojo -> xml)
Languages
bean header php sql
constant javaScript python terser
el jsonpath ref tokenize
exchange

Property
jxpath ruby xpath
file mvel simple xquery
groovy ognl spel xtokenize
camel-catalog:language-list | wc -l
26
Language w/ Simple
Language w/ Groovy
here you can do groovy
programming
Camel DSLs
• Java DSL
• XML DSL (spring or OSGi blueprint)
• Groovy DSL
• Scala DSL
Groovy and Scala

are not much in use
ProducerTemplate
• Client API (alike Spring Templates)
Send a message to
any Camel endpoint
ProducerTemplate
• Client API (alike Spring Templates)
FTP server
Java
Application
How to upload a file
to a FTP server from Java code
ProducerTemplate
FTP server
Java
Application
FluentProducerTemplate
FTP server
Java
Application
Test Kit
camel-test camel-test-blueprint
camel-test-cdi camel-test-karaf
camel-test-spring camel-testng
camel-test
camel-test easy to
run or
debug
camel-test
1) set expectations
camel-test
1) set expectations
2) send message(s)
camel-test
1) set expectations
2) send message(s)
3) assert
Management
• JMX
• Reliable Shutdown
Graceful Shutdown
Route A
Route B
Route C
2
1
3 4
5
6
Startup Shutdown
Stop accept new
messages
Complete current
inflight messages
Camel Commands
• Apache Karaf / ServiceMix / JBoss Fuse









Camel Commands
• Spring Boot
Rest DSL
use REST verbs to define services
that becomes Camel routes
Rest DSL
configure REST
and turn on swagger api
Rest DSL
cd examples/camel-example-swagger-xml
mvn jetty:run
Rest DSL
swagger doc as json schema
Rest DSL
embedded
swagger-ui
Error Handling
Error Handling
Error Handling
Error Handling
Circuit Breaker
• Netflixx Hystrix
New in Camel 2.18
Circuit Breaker
• Integrates with Hystrix Dashboard
Maven Tooling
• Archetypes
camel-archetype-java camel-archetype-component
camel-archetype-spring camel-archetype-api-component
camel-archetype-web camel-archetype-dataformat
camel-archetype-cdi
camel-archetype-spring-boot camel-archetype-scala
camel-archetype-blueprint camel-archetype-groovy
camel-archetype-spring-dm
camel-archetype-scr camel-archetype-java8
New in Camel 2.18
Maven Tooling
• camel-maven-plugin
mvn camel:run
Maven Tooling
• fabric8-camel-maven-plugin
mvn fabric8-camel:validate
http://fabric8.io/guide/camelMavenPlugin.html
Validate your
Camel uris
from the source
All the other stuff
Type Converter Transactions
Interceptors Security
Thread Management Route Policy
Reactive
Asynchronous Non-Blocking
Routing Engine
POJO Routing Debugging & Tracing
Agenda
• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• Running Camel
• More Information
Running Camel
Standalone Web Application
Camel Spring XML JEE Application
Camel Spring Boot Apache Karaf (OSGi)
Camel CDI
Wildfly

(wildfly-camel)
Camel Guice
vert.x

(vertx-camel)
More Information
• My blog
• http://www.davsclaus.com
• Apache Camel 3rd party blogs/articles/etc
• http://camel.apache.org/articles
• Camel videos
• https://vimeo.com/tag:apachecamel
• Best What is Camel article
• https://dzone.com/articles/open-source-
integration-apache
@davsclaus
davsclaus.com

Apache Camel - The integration library