Apache Camel - WJax 2008

Preview:

Citation preview

Leichtgewichtige Enterprise-Integration mit Apache Camel

Christian Meder | inovex GmbH

Agenda

Warum Apache Camel ? Enterprise Integration Patterns Camel

– Konzepte

– DSL

– Beispiel

– Komponenten

– Möglichkeiten Fazit

Enterprise-Integration

Enterprise ApplicationIntegration (EAI)

Service OrientedArchitecture (SOA)

Webservices(WS-*)

Enterprise ServiceBus (ESB)

Message OrientedMiddleware (MOM)

XML

SOAP

WSDL

HTTP

Binärformate

JMS

Nur für Spezialisten ?

Apache Camel

Das Buch

Gregor Hohpe, Bobby WoolfEnterprise Integration Patterns

“The Bible for EnterpriseApplication Integration” (amazon.com)

Cast

Messaging

remove

• location dependencies

• data format dependencies

• temporal dependencies

Enterprise Integration Patterns

• 65 patterns

• Messaging Endpoints

• Message Construction

• Messaging Channels

• Message Routing

• Message Transformation

• System Management

Enterprise Integration Patterns (Basics)

• Channel

• Message

• Pipes and Filters

• Message Router

• Message Translator

• Message Endpoint

EIP (Routing/Transformation)

• Message Filter

• Splitter

• Aggregator

• Resequencer

• Content Enricher

• Content Filter

• Normalizer

Beispiel (VeS)

Vollständig erfundenes Stammdatensystem

Apache Camel

Wurzeln in servicemix-eip, activemq activemq, servicemix, cxf communities implementiert 40 EIP camel-core: commons-logging, jaxb,

activation 1.3.0 April 2008 (208 tasks), 1.4.0 Juli 2008

(261 tasks), 1.5.0 Oktober 2008 (266 tasks) kommerzieller Support

Camel (Konzepte)

CamelContext Component Endpoint Message/Exchange Processor RouteBuilder/Java DSL

CamelContext

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

</camelContext>

Pure Java:CamelContext camel = new DefaultCamelContext();

camelContext.start();

Component

Spring:<bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">

<property name="connectionFactory">

<bean class="org.apache.activemq.ActiveMQConnectionFactory">

<property name="brokerURL" value="vm://localhost?broker.persistent=false"/>

</bean>

</property>

</bean>

Pure Java:Component mailComponent = new org.apache.camel.component.mail.MailComponent();

Endpoint

Spring:<cxf:cxfEndpoint id="routerEndpoint" address="http://localhost:9003/CamelContext/RouterPort"

serviceClass="org.apache.hello_world_soap_http.GreeterImpl"/>

URI:

cxf:bean:routerEndpoint

Pure Java:Endpoint endpoint = component.createEndpoint("log:com.mycompany.part2");

URI:

log:com.mycompany.part2

Message/Exchange/Processor

Pure Java:Exchange exchange = endpoint.createExchange();

exchange.getIn().setBody(name);

public class MyProcessor implements Processor {

public void process(Exchange exchange) throws Exception {

// do something...

}

}

Processor myProcessor = new MyProcessor();

RouteBuilder

Spring:<camelContext xmlns="http://activemq.apache.org/camel/schema/spring">

<route>

<from uri="activemq:Input"/>

<bean ref="myBeanName" method="doTransform"/>

<to uri="activemq:Output"/>

</route>

</camelContext>

RouteBuilder (Java DSL)

Pure Java:from("activemq:Input").beanRef("myBeanName", "doTransform").to("activemq:Output");

RouteBuilder builder = new RouteBuilder() {

public void configure() {

from("queue:a").filter(header("foo").isEqualTo("bar")).to("queue:b");

from("queue:c").choice()

.when(header("foo").isEqualTo("bar")).to("queue:d")

.when(header("foo").isEqualTo("cheese")).to("queue:e")

.otherwise().to("queue:f");

}

};

myCamelContext.addRoutes(builder);

RouteBuilder (Scala DSL beta)

class MyRouteBuilder extends RouteBuilder {

"direct:a" --> "mock:a"

"direct:b" to "mock:b"

}

VeS (Splitter)

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

<route>

<from uri="cxf:requests"/>

<splitter>

<xpath>/login | /account</xpath>

<to uri="direct:splitrequest"/>

</splitter>

</route>

</camelContext>

VeS (Router)

RouteBuilder builder = new RouteBuilder() {

public void configure() {

from("direct:splitrequest").choice().when(xpath("/login")).to("seda:loginData")

.when(xpath("/account")).to("seda:accountData");

}

};

VeS (2. Router)

RouteBuilder builder = new RouteBuilder() {

public void configure() {

from("seda:accountData").choice().when(groovy(“request.account.id =~ /A.*/”))

.to("seda:oldAccountData")

.when(groovy("request.account.id =~ /B.*/")).to("seda:newAccountData");

}

};

VeS (Transformation)

<route>

<from uri="seda:loginData"/>

<bean ref="loginBackend" method="doTransform"/>

<to uri="seda:loginBackend"/>

</route>

Expression Languages

from("queue:a").filter(header("foo").isEqualTo("bar")header("foo").isEqualTo("bar")).to("queue:b");

Expression Language filter().el("${in.headers['My Header'] == 'bar'}")

OGNL filter().ognl("request.headers.foo = 'bar'")

Javascript filter().javaScript("request.headers.get('user') == 'admin'")

Groovy filter().groovy("request.lineItems.any { i -> i.value > 100 }")

Python filter().python("request.headers['user'] == 'admin'")

Ruby filter().ruby("$request.headers['user'] == 'admin'")

Xpath filter().xpath("//foo")

Xquery filter().xquery("//foo")

Scripting languages via JSR223

Components

ActiveMQ (activemq:FOO.BAR) Atom (atom://atomUri) CXF (cxf:bean:cxfEndpoint) Spring events (spring-event://default) File (file://inputdir/?delete=true) Financial Information eXchange

(fix://configurationResource)

Components

Flatpack (flatpack:fixed:foo.pzmap.xml) FTP

(ftp://camelrider@localhost:21/public/downloads)

HL7 (Health Level 7) HTTP/Jetty JBI (jbi:service:http://foo.bar.org/Service) Java Content Repository

(jcr://user:pass@repository/repo)

Components

JMS (jms:FOO.BAR) JPA (jpa:account) LDAP (ldap:localhost:1024) Log (log:org.camel.example.Foo) Mail (imap://admin@mymailserver.com) Mina (mina:tcp://localhost:6200?

textline=true) Mock (mock:foo) RMI (rmi://localhost:1099/foo)

Components

Seda (seda:start) Smooks (EDI parsing) Test (test:file://data/expectedOutput) Timer (timer://foo?

fixedRate=true&period=60000) Velocity

(velocity:com/acme/MyResponse.vm) Vm (vm:foo) Xmpp (xmpp://fromAlias/toAlias)

Möglichkeiten

BAM (Wiretap Pattern) Bean Integration Visualisierung Komponenten-

erstellung

Fazit

Apache Camel ist klein leicht fokussiert modular

Don't get the hump, try Camel today.

Credits

the camel riders IBM System 360 (CC cote on flickr) the camel's way (CC lovelypetal on flickr)