Upload
matthew-mccullough
View
4.736
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Bruce Snyder's excellent talk on Apache Camel to the Denver Open Source Users Group (www.denveropensource.org) in June 2008
Citation preview
2
Integration is Messy!
System Integration
3
Data Formats
4
Apache Camel
http://activemq.apache.org/camel/5
What is Apache Camel?
6
Enterprise Integration Patterns
http://enterpriseintegrationpatterns.com/
7
Patterns
8
Message Routing
9
Language Support
10
• BeanShell• Javascript• Groovy• Python• PHP• Ruby
• SQL• XPath• XQuery• OGNL• JSR 223 scripting
Apache Camel Components
11
http://activemq.apache.org/camel/components.html
History of Apache Camel
12
The Camel Context
13
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <package>com.acme.quotes</package></camelContext>
CamelContext context = new DefaultCamelContext();context.addRoutes(new MyRouteBuilder());context.start();
Pattern Examples
14
Patterns Again
15
Content Based Router
RouteBuilder builder = new RouteBuilder() { public void configure() { from("seda:a").choice().when(header("foo") .isEqualTo("bar")).to("seda:b") .when(header("foo").isEqualTo("cheese")) .to("seda:c").otherwise().to("seda:d"); } };
16
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="activemq:NewOrders"/> <choice> <when> <xpath>/order/product = 'widget'</xpath> <to uri="activemq:Orders.Widgets"/> </when> <when> <xpath>/order/product = 'gadget'</xpath> <to uri="activemq:Orders.Gadgets"/> </when> <otherwise> <to uri="activemq:Orders.Bad"/> </otherwise> </choice> </route> </camelContext>
Content Based Router
17
Message Filter
18
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:topic:Quotes). filter().xpath("/quote/product = ‘widget’"). to("mqseries:WidgetQuotes"); }}
Message Filter
19
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="activemq:topic:Quotes"/> <filter> <xpath>/quote/product = ‘widget’</xpath> <to uri="mqseries:WidgetQuotes"/> </filter> </route> </camelContext>
Splitter
20
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("file://orders"). splitter(body().tokenize("\n")). to("activemq:Order.Items"); }}
Splitter Using XQuery
21
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("file://orders"). splitter().xquery("/order/items"). to("activemq:Order.Items"); }}
Aggregator
22
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:Inventory.Items"). aggregator().xpath("/order/@id"). to("activemq:Inventory.Order"); }}
Message Translator
23
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("file://incoming”). to("xslt:com/acme/mytransform.xsl"). to("http://outgoing.com/foo"); }}
Resequencer
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:a”). resequencer(header("JMSPriority")). to("seda:b"); }}
24
Throttler
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”). throttler(3).timePeriodMillis(30000). to("seda:b"); }}
25
Delayer
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”). delayer(header("JMSTimestamp", 3000). to("seda:b"); }}
26
Combine Patterns
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”). resequencer(header("JMSPriority")). delayer(3000). to("seda:b"); }}
27
Beans
28
Bean
29
package com.mycompany.beans;
public class MyBean {
public void someMethod(String name) { ... }}
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <package>com.mycompany.beans</package></camelContext>
Bean as a Message Translator
30
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:Incoming”). beanRef("myBean"). to("activemq:Outgoing"); }}
Bean as a Message Translator
31
public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:Incoming”). beanRef("myBean", "someMethod"). to("activemq:Outgoing"); }}
*With Method Name
Type Conversion
32
Type Conversion
33
@Converterpublic class IOConverter {
@Converter public static InputStream toInputStream(File file) throws FileNotFoundException { return new BufferedInputStream(
new FileInputStream(file)); }}
Binding Beans to Camel Endpoints
34
public class Foo {
@MessageDriven(uri="activemq:cheese") public void onCheese(String name) { ... }}
Binding Method Arguments
35
public class Foo {
public void onCheese( @XPath("/foo/bar") String name, @Header("JMSCorrelationID") String id) { ... }}
http://activemq.apache.org/camel/bean-integration.html
Injecting Endpoints Into Beans
36
public class Foo { @EndpointInject(uri="activemq:foo.bar") ProducerTemplate producer;
public void doSomething() { if (whatever) { producer.sendBody("<hello>world!</hello>"); } }}
Spring Remoting - Server Side
37
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <export id="sayService" uri="activemq:MyService" serviceRef="sayImpl" serviceInterface="com.acme.MyServiceInterface"/></camelContext>
<bean id="sayImpl" class="com.acme.MyServiceImpl"/>
Spring Remoting - Client Side
38
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <proxy id="sayService" serviceUrl="activemq:MyService" serviceInterface="com.acme.MyServiceInterface"/></camelContext>
Dependency Injection
39
<camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> ...</camelContext>
<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>
Business Activity Monitoring (BAM)
40
Business Activity Monitoring (BAM)
41
public class MyActivities extends ProcessBuilder {
public void configure() throws Exception {
// lets define some activities, correlating on an // XPath query of the message body ActivityBuilder purchaseOrder = activity("activemq:PurchaseOrders") .correlate(xpath("/purchaseOrder/@id").stringResult());
ActivityBuilder invoice = activity("activemq:Invoices") .correlate(xpath("/invoice/@purchaseOrderId").stringResult());
// now lets add some BAM rules invoice.starts().after(purchaseOrder.completes()) .expectWithin(seconds(1)) .errorIfOver(seconds(2)).to("activemq:FailedProcesses"); }}
Ride the Camel!
42
Questions?
43