apache camel introduction & what's in the box

Post on 21-Apr-2017

2.524 Views

Category:

Internet

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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?

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("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

top related