Apache Camel Introduction
& What's in the box
Claus Ibsen @davsclaus
Claus Ibsen• Principal Software Engineer at Red Hat
• Apache Camel
• 8 years working with Camel
• Author of Camel in Action books
@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 Codeimport 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 DSLimport 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
Camel Java Tooling
Camel Forge
Just XML
Camel XML Tooling
Camel XML Tooling
http://tools.jboss.org/features/apachecamel.html
Architecture
Componentsahc bindy coap docker
ahc-ws blueprint cometd dozerapns boon context dropbox
atmosphere box couchdb eclipseatom cache crypto ejbaws cassandraql csv elasticsearchbam castor cfx elsql
bean-validator cdi cxf-transport eventadminbeanio chunk disruptor exec
beanstalk cmis dns facebook
Componentsflatpack google-drive hbase jacksonxml
fop google-mail hdfs jasyptfreemarker gora hdfs2 javaspace
ftp grape http jaxbgae groovy http4 jbpm
ganglia gson ibatis jcloudsgeocoder guava-eventbus ical jcr
git guice infinispan jdbcgithub hawtdb irc jetty8
google-calendar hazelcast jackson jetty9
Componentsjgroups jsonpath leveldb mustache
jibx jt400 linkedin mveljing juel lucene mybatisjira jxpath mail nettyjms kafka metrics netty-httpjmx kestrel mina netty4jolt krati mina2 netty4-http
josql kubernetes mongodb ognljpa kura mqtt olingo2jsch ldap msv openshift
Componentsoptaplanner rabbitmq scala smpp
paho restlet schematron snpppaxlogging rmi scr soap
pdf routebox script solrpgevent rss servlet spark-restprinter ruby servletlistener spring
protobuf rx shiro spring-batchquartz salesforce sip spring-bootquarz2 sap-netweaver sjms spring-integrationquickfix saxon slack spring-javaconfig
Componentsspring-ldap swagger undertow xmlsecurityspring-redis swagger-java univocity xmpp
spring-security syslog urlrewrite xstreamspring-ws tagsoup velocity yammer
sql tarfile vertx zipfilessh test weather zookeeperstax test-blueprint websocket
stomp test-spring xmlbeansstream testng xmljson
stringtemplate twitter xmlrpc
+
+
+
+
+
+
+
+
+ =
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.16.2
• tar xf apache-camel-2.16.2.tar.gz • cd apache-camel-2.16.2 • 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.60:camel
http://hawt.io/maven
Widget & Gadget Example• camel-example-widget-gadget-xml
bin/activemq console mvn exec:java
There is a Java
example also
Requires ActiveMQ running
Agenda• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• More Information
What's in the Camel Box?
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("reslet: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("reslet: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("reslet: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
Componentsahc bindy coap docker
ahc-ws blueprint cometd dozerapns boon context dropbox
atmosphere box couchdb eclipseatom cache crypto ejbaws cassandraql csv elasticsearchbam castor cfx elsql
bean-validator cdi cxf-transport eventadminbeanio chunk disruptor exec
beanstalk cmis dns facebook
camel-catalog:component-list | wc -l 207
Data Formatsavro flatpack pgp univocity-fixed
barcode gzip protobuf univocity-tsvbase64 hl7 rss xmlBeansbeanio ical secureXML xmjson
bindy-csv jacksonxml serialization xmlrpcbindy-fixed jaxb soapjaxb xstreambindy-kvp jibx string zip
boon json-gson syslog zipfilecastor json-jackson tarfilecrypto json-xstream tidyMarkup
csv mime-multipart univocity-csv
camel-catalog:dataformat-list | wc -l 41
Data Format with JAXB• POJO class with @JAXB annotations
Data Format with JAXB• marshal (xml -> pojo) • unmarshal (pojo -> xml)
Languagesbean header php sql
constant javaScript python terser
el jsonpath ref tokenize
exchangeProperty jxpath ruby xpath
file mvel simple xquery
groovy ognl spel xtokenize
camel-catalog:language-list | wc -l 24
Language w/ Simple
Language w/ Groovyhere you can do groovy
programming
Camel DSLs
• Java DSL
• XML DSL (spring or OSGi blueprint)
• Groovy DSL
• Scala DSL
Groovy and Scalaare not much in use
Type Converters
DefaultTypeConverter INFOLoaded 183 type converters
Type Converters• Camel provides
type convertersfor most commontypes in Java
hawtio can list the converters
Type Convertersexplicit type conversion
using convertBodyTo
Type Convertersimplicit type conversion
Camel will automatic convert from
java.io.File to String
Writing customType Converter
META-INF/services/org/apache/camel/TypeConverter com.acme.MyTypeConverter
Property Placeholders• Externalize configuration
myapp.properties
hi=Hello port=9090 myQueueName=greeting
• Camel PropertyPlaceholder
Property Placeholders
Property Placeholders• Bridge with Spring Property Placeholder
Spring: ${xxx} Camel: {{xxx}}
ProducerTemplate• Client API (alike Spring Templates)
Send a message to any Camel endpoint
ProducerTemplate• Client API (alike Spring Templates)
FTP serverJava Application
How to upload a file to a FTP server from Java code
ProducerTemplate
FTP serverJava Application
Test Kit
camel-test camel-test-blueprint
camel-test-spring camel-testng
camel-test-cdi in the works
camel-test
camel-test easy to run or debug
camel-test1) set expectations
camel-test1) set expectations
2) send message(s)
camel-test1) set expectations
2) send message(s)
3) assert
camel-test-spring
Notice the extends
Testing 'Production' Routes
how to test route without any mock endpoints ?
MockAndSkipmock and skip sending to the target endpoint
TIP you can also use wildcards and not skip
mock: added as prefix
AdviceWithenable
adviceWith
add mock endpoint last
start Camel after adviceWith
NotifyBuilderBlackbox testing the
'production' route
NotifyBuilder
NotifyBuilder1) set expectations
2) send message(s)
3) assert
Management• JMX
Management• REST (w/ Jolokia)
jolokia/exec/org.apache.camel:context=camel,type=context,
name="camel"/dumpRoutesAsXml()
hawtio uses Jolokia
http://hawt.io/
Management• Java API
• Control Bus
Managementto stop a route from a route
Inflight Repository• Track messages during routing
• 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 / JBoss Fuse
Camel Commands• Spring Boot
Camel Commands• fabric8-forge
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-java mvn jetty:run
Rest DSL
swagger doc as json schema
Rest DSL
embedded swagger-ui
Error Handling
Error Handling
Error Handling
Error Handling
Maven Tooling• Archetypes
camel-archetype-java camel-archetype-componentcamel-archetype-spring camel-archetype-api-component
camel-archetype-web camel-archetype-dataformat
camel-archetype-cdi
camel-archetype-spring-boot camel-archetype-scalacamel-archetype-blueprint camel-archetype-groovy
camel-archetype-spring-dm
camel-archetype-scr
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• Transactions
• Interceptors
• Security
• Thread Management
• Route Policy
• Reactive Asynchronous Routing Engine
• POJO Routing
• Debugging and Tracing
Agenda• What is Apache Camel?
• Little Example
• Trying Apache Camel
• What's in the Camel Box?
• Running Camel
• More Information
Running CamelStandalone Web Application
Camel Spring XML JEE Application
Camel Spring Boot Apache Karaf (OSGi)
Camel CDI Wildfly(wildfly-camel)
Camel Guice vert.x (vertx-camel)
Running Camel
Just need a Java Runtime
Running 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 • Free chapter 1 covers Camel concepts to learn
• http://manning.com/ibsen/chapter1sample.pdf
@davsclaus davsclaus.com