SlideShare a Scribd company logo
Using
Enterprise Integration Patterns
    as Your Camel Jockey


            Bruce Snyder
         bsnyder@apache.org

            IASA Denver
           September 2009     1
Integration
     is
everywhere!
          2
Just Because You Can, Doesn’t Mean You Should




                                           3
And Then There’s the Llama Car




                                 4
Options For Integration


1                             2




               3




                                  5
Option One - DIY




              Do It Yourself
                               6
Option Two - Buy It




                      Buy It
                               7
Option Three - Adopt It




                  Adopt It
                             8
What Are Design Patterns?




       A design pattern is a formal way of
       documenting a solution to a design
       problem in a particular field of
       expertise.
     (Wikipedia)




                                             9
Enterprise Integration Patterns




Got EIP?
Pattern Overview




                   11
Visualizing EIPs




:: Stencils exist for Visio and OmniGraffle
   :: http://www.eaipatterns.com/downloads.html




                                                  12
What is Apache Camel?




                           A framework for simplifying
                           integration through the use of the
                           Enterprise Integration Patterns for
                           message mediation, processing,
http://camel.apache.org/
                           routing and transformation




                                                             13
Apache Camel is Focused on EIP




                            =>




 http://camel.apache.org/        http://eaipatterns.com/

                                                           14
History of Apache Camel




                          15
Message Routing




        from("A").to("B");




                             16
Simple Routing




        from("file:///tmp/myFile.txt").
        to("jms:TEST.Q");




                                          17
Slightly More Complex Routing




    from("file:///tmp/myFile.txt").
    to("bean:MyBean?method=handleMessage").
    to("jms:TEST.Q");




                                              18
Multicast Routing




     from("file:///tmp/myFile.txt").
     choice().when().
       method("MyBean", "matches").
       to("Q").
     end().
     multicast("B", "C", "D");
                                       19
Pipeline Routing




     from("file:///tmp/myFile.txt").
     choice().when().
       method("MyBean", "matches").
       to("Q").
     end().
     pipeline("B", "C", "D");

                                       20
Camel Components

:: 70+ components supported




                              21
Pattern
Examples
           22
Patterns Again




                 23
Content Based Router




   RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("activemq:NewOrders")
       .choice()
         .when(header("order-type").isEqualTo("widget"))
           .to("activemq:Orders.Widgets")
         .when(header("order-type").isEqualTo("gadget"))
           .to("activemq:Orders.Gadgets")
         .otherwise()
           .to("file:errors");
         }
     };                                                    Java DSL
                                                                24
Content Based Router

 <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>
                                                            Spring DSL
                                                                   25
Message Filter




     public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("activemq:topic:Orders)
             .filter().xpath("/order/product = ʻwidgetʼ")
                .to("ftp://bsnyder@host:2223/widgets/orders");
      }
     }




                                                                 Java DSL
                                                                      26
Message Filter



    <camelContext
     xmlns="http://activemq.apache.org/camel/schema/spring">
      <route>
       <from uri="activemq:topic:Orders"/>
       <filter>
         <xpath>/order/product = ʻwidgetʼ</xpath>
         <to uri="ftp://bsnyder@host:2223/widgets/orders"/>
       </filter>
      </route>
     </camelContext>




                                                               Spring DSL
                                                                      27
Splitter




      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("file:///orders")
             .splitter(body(String.class).tokenize("n"))
               .to("activemq:Order.Items");
          }
        }


                                                            Java DSL
                                                                 28
Splitter




          <camelContext id="camel"
      xmlns="http://camel.apache.org/schema/spring">
      <route>
       <from uri="file:///orders" />
       <split>
         <tokenize token="n" />
         <to uri="activemq:Order.Items" />
       </split>
      </route>
     </camelContext>




                                                       Spring DSL
                                                              29
Aggregator




    public class MyRouteBuilder extends RouteBuilder {
      public void configure() {
        from("activemq:STOCKS")
        .aggregator(header("symbol"))
          .batchSize(10)
          .to("activemq:MY.STOCKS");
      }
    }


                                                         Java DSL
                                                              30
Aggregator




         <camelContext id="camel"
     xmlns="http://camel.apache.org/schema/spring">
     <route>
      <from uri="file:///orders" />
      <aggregate>
        <correlationExpression>
         <simple>header.symbol</simple>
        </correlationExpression>
        <batchSize>10</batchSize>
        <to uri="activemq:MY.STOCKS" />
       </aggregate>
     </route>
    </camelContext>



                                                      Spring DSL
                                                             31
Throttler



      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("seda:a”)
            .throttler(3).timePeriodMillis(30000)
            .to("seda:b");
        }
      }




                                                           Java DSL
                                                                32
Delayer



    public class MyRouteBuilder extends RouteBuilder {
      public void configure() {
        from("seda:a”)
           .delayer(header("JMSTimestamp", 3000)
           .to("seda:b");
        }
      }




                                                         Java DSL
                                                              33
Load Balancer

   public class MyRouteBuilder extends RouteBuilder {
      public void configure() {
        from("file:/path/to/file")
        .loadBalance().roundRobin()
           .to("file:///one", "activemq:MY.Q", "http://host1:8181/fooApp");
     }
  }



   Policy                                Description
 Round Robin       Balance the exchange load across the available endpoints

   Random          Randomly choose an endpoint to send the exchange

    Sticky         Sticky load balancing of exchanges using an expression

    Topic          Send exchange to all endpoints (JMS topic semantics)

                                                                             Java DSL
                                                                                  34
Multicast


    public class MyRouteBuilder extends RouteBuilder {
      public void configure() {
        from("direct:a")
          .multicast()
          .to("direct:x", "mock:y", "file:///tmp/bar?fileName=test.txt");
        }
      }




                                                                          Java DSL
                                                                               35
More
Patterns
           36
Wire Tap




      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("direct:a")
            .to("log:com.mycompany.messages?level=info")
            .to("mock:foo");
          }
        }



                                                           Java DSL
                                                                37
Content Enricher




      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("activemq:My.Queue")
            .to("velocity:com/acme/MyResponse.vm")
            .to("activemq:Another.Queue");
          }
        }



                                                           Java DSL
                                                                38
More Content Enricher




     public class MyRouteBuilder extends RouteBuilder {
         public void configure() {
          from("activemq:My.Queue")
            .beanRef("myPojo", “methodName”)
            .to("activemq:Another.Queue");
       }
     }



                                                          Java DSL
                                                               39
Content Filter




      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("direct:start").process(new Processor() {
             public void process(Exchange exchange) {
               Message in = exchange.getIn();
               in.setBody(in.getBody(String.class) + " World!");
             }
         }).to("mock:result");
           }
     }



                                                                   Java DSL
                                                                        40
Combine Patterns



      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
          from("seda:a”).
            resequencer(header("JMSGroupSeq")).
             delayer(3000).
               to("mock:x");
          }
        }




                                                           Java DSL
                                                                41
Error Handling in Camel

:: Global Error Handler:
        RouteBuilder builder = new RouteBuilder() {
            public void configure() {
                errorHandler(deadLetterChannel("file:errors"));
                from("bean:foo").to("seda:b");
          }
        };



:: Local Error Handler:
        RouteBuilder builder = new RouteBuilder() {
            public void configure() {
              from("seda:a").
                errorHandler(loggingErrorHandler("FOO.BAR")).
                to("seda:b");
              from("seda:b").to("seda:c");
          }                                                      Java DSL
        };                                                            42
Exception Policies in Camel


 RouteBuilder builder = new RouteBuilder() {
     public void configure() {
         exception(IOException.class)
           .initialRedeliveryDelay(5000L)
           .maximumRedeliveries(3)
           .maximumRedeliveryDelay(30000L)
           .backOffMultiplier(1.0)
           .useExponentialBackOff()
           .setHeader(MESSAGE_INFO, constant("Damned IOException!"))
           .to("activemq:errors");
         from("seda:a").to("seda:b");
    }
 }; 




                                                                       Java DSL
                                                                            43
Make Context Discover Beans



          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>




                                                                44
Bean as a Message Translator



      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
            from("activemq:Incoming”).
              beanRef("myBean").
               to("activemq:Outgoing");
          }
        }




                                                           Java DSL
                                                                45
Bean as a Message Translator


 *With Method Name

      public class MyRouteBuilder extends RouteBuilder {
        public void configure() {
              from("activemq:Incoming”).
                beanRef("myBean", "someMethod").
                 to("activemq:Outgoing");
          }
      }




                                                           Java DSL
                                                                46
Binding Beans to Camel Endpoints


        public class Foo {

            @MessageDriven(uri=”activemq:cheese”)
            public void onCheese(String name) {
              ...
            }
        }




                                                    Java DSL
                                                         47
Binding Method Arguments


        public class Foo {

            public void onCheese(
              @XPath(“/foo/bar/”) String name,
              @Header(“JMSCorrelationID”) String id) {
              ...
            }
        }




                                                         Java DSL
                                                              48
Injecting Endpoints Into Beans


        public class Foo {
         @EndpointInject(uri= “activemq:foo.bar”)
         ProducerTemplate producer;

            public void doSomething() {
              if (whatever) {
                producer.sendBody(“<hello>world</hello>”);
              }
            }
        }




                                                             Java DSL
                                                                  49
Type Convertors

     public class MyRouteBuilder extends RouteBuilder {
       public void configure() {
         from("direct:start").process(new Processor() {
            public void process(Exchange exchange) {
              Message in = exchange.getIn();
              in.setBody(in.getBody(String.class) + " World!");
            }
        }).to("mock:result");
          }
    }



       Support for the following types:
       • File
       • String
       • byte[] and ByteBuffer
       • InputStream and OutputStream
       • Reader and Writer
       • Document and Source
                                                                  50
Type Conversion


       @Converter
       public class IOConverter {

           @Converter
           public static InputStream toInputStream(File file)
            throws FileNotFoundException {
              return new BufferedInputStream(
                     new FileInputStream(file));
            }
       }




                                                               51
Business Activity Monitoring (BAM)


 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");
     }
 }


                                                                                52
The Camel Truck!




                   53
Ride the
Camel!
http://camel.apache.org/

       bsnyder@apache.org
   http://twitter.com/brucesnyder   54

More Related Content

What's hot (19)

PDF
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
PDF
Faster & Greater Messaging System HornetQ zzz
JBug Italy
 
ODP
Spring 4 final xtr_presentation
sourabh aggarwal
 
PDF
April 2010 - JBoss Web Services
JBug Italy
 
PPTX
Java 9
Joanna Sokołowicz
 
PDF
Lecture 7 Web Services JAX-WS & JAX-RS
Fahad Golra
 
PDF
Camel and JBoss
JBug Italy
 
KEY
Multi Client Development with Spring
Joshua Long
 
PDF
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
e-Legion
 
PDF
Spring Framework - MVC
Dzmitry Naskou
 
PPTX
Petro Gordiievych "From Java 9 to Java 12"
LogeekNightUkraine
 
PDF
11-DWR-and-JQuery
tutorialsruby
 
PDF
Java EE 與 雲端運算的展望
javatwo2011
 
PDF
Wt unit 3 server side technology
PUNE VIDYARTHI GRIHA'S COLLEGE OF ENGINEERING, NASHIK
 
PPTX
Spring 3.x - Spring MVC - Advanced topics
Guy Nir
 
PPTX
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
balassaitis
 
PPTX
SpringBoot with MyBatis, Flyway, QueryDSL
Sunghyouk Bae
 
PDF
When Ruby Meets Java - The Power of Torquebox
rockyjaiswal
 
PDF
Short intro to scala and the play framework
Felipe
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
Faster & Greater Messaging System HornetQ zzz
JBug Italy
 
Spring 4 final xtr_presentation
sourabh aggarwal
 
April 2010 - JBoss Web Services
JBug Italy
 
Lecture 7 Web Services JAX-WS & JAX-RS
Fahad Golra
 
Camel and JBoss
JBug Italy
 
Multi Client Development with Spring
Joshua Long
 
«ReactiveCocoa и MVVM» — Николай Касьянов, SoftWear
e-Legion
 
Spring Framework - MVC
Dzmitry Naskou
 
Petro Gordiievych "From Java 9 to Java 12"
LogeekNightUkraine
 
11-DWR-and-JQuery
tutorialsruby
 
Java EE 與 雲端運算的展望
javatwo2011
 
Spring 3.x - Spring MVC - Advanced topics
Guy Nir
 
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
balassaitis
 
SpringBoot with MyBatis, Flyway, QueryDSL
Sunghyouk Bae
 
When Ruby Meets Java - The Power of Torquebox
rockyjaiswal
 
Short intro to scala and the play framework
Felipe
 

Similar to Using Enterprise Integration Patterns as Your Camel Jockey (20)

PDF
Taking Apache Camel For a Ride
Bruce Snyder
 
PDF
DOSUG Taking Apache Camel For A Ride
Matthew McCullough
 
KEY
Aimaf
Saad RGUIG
 
PDF
Red Hat Agile integration Workshop Labs
Judy Breedlove
 
PPTX
Hazelcast and MongoDB at Cloud CMS
uzquiano
 
PDF
Easy Enterprise Integration Patterns with Apache Camel, ActiveMQ and ServiceMix
elliando dias
 
PPTX
Camel as a_glue
Andriy Andrunevchyn
 
PDF
Service-Oriented Integration With Apache ServiceMix
Bruce Snyder
 
PDF
TS 4839 - Enterprise Integration Patterns in Practice
aegloff
 
PDF
Taking Apache Camel For A Ride
Bruce Snyder
 
PDF
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Nikhil Bhalwankar
 
PDF
Camel Scala
elliando dias
 
PDF
camel-scala.pdf
Hiroshi Ono
 
PDF
Developing a new Scala DSL for Apache Camel
elliando dias
 
PDF
camel-scala.pdf
Hiroshi Ono
 
PDF
camel-scala.pdf
Hiroshi Ono
 
PDF
camel-scala.pdf
Hiroshi Ono
 
PDF
Using Backbone.js with Drupal 7 and 8
Ovadiah Myrgorod
 
PPTX
Introduction To Apache Mesos
Joe Stein
 
PDF
JavaScript Modules Past, Present and Future
Igalia
 
Taking Apache Camel For a Ride
Bruce Snyder
 
DOSUG Taking Apache Camel For A Ride
Matthew McCullough
 
Aimaf
Saad RGUIG
 
Red Hat Agile integration Workshop Labs
Judy Breedlove
 
Hazelcast and MongoDB at Cloud CMS
uzquiano
 
Easy Enterprise Integration Patterns with Apache Camel, ActiveMQ and ServiceMix
elliando dias
 
Camel as a_glue
Andriy Andrunevchyn
 
Service-Oriented Integration With Apache ServiceMix
Bruce Snyder
 
TS 4839 - Enterprise Integration Patterns in Practice
aegloff
 
Taking Apache Camel For A Ride
Bruce Snyder
 
Maven + Jsf + Richfaces + Jxl + Jdbc - Complete Code Example
Nikhil Bhalwankar
 
Camel Scala
elliando dias
 
camel-scala.pdf
Hiroshi Ono
 
Developing a new Scala DSL for Apache Camel
elliando dias
 
camel-scala.pdf
Hiroshi Ono
 
camel-scala.pdf
Hiroshi Ono
 
camel-scala.pdf
Hiroshi Ono
 
Using Backbone.js with Drupal 7 and 8
Ovadiah Myrgorod
 
Introduction To Apache Mesos
Joe Stein
 
JavaScript Modules Past, Present and Future
Igalia
 
Ad

More from Bruce Snyder (11)

PDF
Beyond Horizontal Scalability: Concurrency and Messaging Using Spring
Bruce Snyder
 
PDF
Enterprise Messaging With Spring JMS
Bruce Snyder
 
PDF
Styles of Applicaton Integration Using Spring
Bruce Snyder
 
PDF
ActiveMQ In Action
Bruce Snyder
 
PDF
ActiveMQ In Action - ApacheCon 2011
Bruce Snyder
 
PDF
Apache ActiveMQ and Apache ServiceMix
Bruce Snyder
 
PDF
Messaging With Apache ActiveMQ
Bruce Snyder
 
PDF
Enterprise Messaging With ActiveMQ and Spring JMS
Bruce Snyder
 
PDF
Service Oriented Integration With ServiceMix
Bruce Snyder
 
PDF
Messaging With ActiveMQ
Bruce Snyder
 
PDF
Taking Apache Camel For A Ride
Bruce Snyder
 
Beyond Horizontal Scalability: Concurrency and Messaging Using Spring
Bruce Snyder
 
Enterprise Messaging With Spring JMS
Bruce Snyder
 
Styles of Applicaton Integration Using Spring
Bruce Snyder
 
ActiveMQ In Action
Bruce Snyder
 
ActiveMQ In Action - ApacheCon 2011
Bruce Snyder
 
Apache ActiveMQ and Apache ServiceMix
Bruce Snyder
 
Messaging With Apache ActiveMQ
Bruce Snyder
 
Enterprise Messaging With ActiveMQ and Spring JMS
Bruce Snyder
 
Service Oriented Integration With ServiceMix
Bruce Snyder
 
Messaging With ActiveMQ
Bruce Snyder
 
Taking Apache Camel For A Ride
Bruce Snyder
 
Ad

Recently uploaded (20)

PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Biography of Daniel Podor.pdf
Daniel Podor
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 

Using Enterprise Integration Patterns as Your Camel Jockey

  • 1. Using Enterprise Integration Patterns as Your Camel Jockey Bruce Snyder [email protected] IASA Denver September 2009 1
  • 2. Integration is everywhere! 2
  • 3. Just Because You Can, Doesn’t Mean You Should 3
  • 4. And Then There’s the Llama Car 4
  • 6. Option One - DIY Do It Yourself 6
  • 7. Option Two - Buy It Buy It 7
  • 8. Option Three - Adopt It Adopt It 8
  • 9. What Are Design Patterns? A design pattern is a formal way of documenting a solution to a design problem in a particular field of expertise. (Wikipedia) 9
  • 12. Visualizing EIPs :: Stencils exist for Visio and OmniGraffle :: http://www.eaipatterns.com/downloads.html 12
  • 13. What is Apache Camel? A framework for simplifying integration through the use of the Enterprise Integration Patterns for message mediation, processing, http://camel.apache.org/ routing and transformation 13
  • 14. Apache Camel is Focused on EIP => http://camel.apache.org/ http://eaipatterns.com/ 14
  • 15. History of Apache Camel 15
  • 16. Message Routing from("A").to("B"); 16
  • 17. Simple Routing from("file:///tmp/myFile.txt"). to("jms:TEST.Q"); 17
  • 18. Slightly More Complex Routing from("file:///tmp/myFile.txt"). to("bean:MyBean?method=handleMessage"). to("jms:TEST.Q"); 18
  • 19. Multicast Routing from("file:///tmp/myFile.txt"). choice().when(). method("MyBean", "matches"). to("Q"). end(). multicast("B", "C", "D"); 19
  • 20. Pipeline Routing from("file:///tmp/myFile.txt"). choice().when(). method("MyBean", "matches"). to("Q"). end(). pipeline("B", "C", "D"); 20
  • 21. Camel Components :: 70+ components supported 21
  • 24. Content Based Router RouteBuilder builder = new RouteBuilder() { public void configure() { from("activemq:NewOrders") .choice() .when(header("order-type").isEqualTo("widget")) .to("activemq:Orders.Widgets") .when(header("order-type").isEqualTo("gadget")) .to("activemq:Orders.Gadgets") .otherwise() .to("file:errors"); } }; Java DSL 24
  • 25. Content Based Router <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> Spring DSL 25
  • 26. Message Filter public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:topic:Orders) .filter().xpath("/order/product = ʻwidgetʼ") .to("ftp://bsnyder@host:2223/widgets/orders"); } } Java DSL 26
  • 27. Message Filter <camelContext xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="activemq:topic:Orders"/> <filter> <xpath>/order/product = ʻwidgetʼ</xpath> <to uri="ftp://bsnyder@host:2223/widgets/orders"/> </filter> </route> </camelContext> Spring DSL 27
  • 28. Splitter public class MyRouteBuilder extends RouteBuilder { public void configure() { from("file:///orders") .splitter(body(String.class).tokenize("n")) .to("activemq:Order.Items"); } } Java DSL 28
  • 29. Splitter <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="file:///orders" /> <split> <tokenize token="n" /> <to uri="activemq:Order.Items" /> </split> </route> </camelContext> Spring DSL 29
  • 30. Aggregator public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:STOCKS") .aggregator(header("symbol")) .batchSize(10) .to("activemq:MY.STOCKS"); } } Java DSL 30
  • 31. Aggregator <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="file:///orders" /> <aggregate> <correlationExpression> <simple>header.symbol</simple> </correlationExpression> <batchSize>10</batchSize> <to uri="activemq:MY.STOCKS" /> </aggregate> </route> </camelContext> Spring DSL 31
  • 32. Throttler public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”) .throttler(3).timePeriodMillis(30000) .to("seda:b"); } } Java DSL 32
  • 33. Delayer public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”) .delayer(header("JMSTimestamp", 3000) .to("seda:b"); } } Java DSL 33
  • 34. Load Balancer public class MyRouteBuilder extends RouteBuilder { public void configure() { from("file:/path/to/file") .loadBalance().roundRobin() .to("file:///one", "activemq:MY.Q", "http://host1:8181/fooApp"); } } Policy Description Round Robin Balance the exchange load across the available endpoints Random Randomly choose an endpoint to send the exchange Sticky Sticky load balancing of exchanges using an expression Topic Send exchange to all endpoints (JMS topic semantics) Java DSL 34
  • 35. Multicast public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:a") .multicast() .to("direct:x", "mock:y", "file:///tmp/bar?fileName=test.txt"); } } Java DSL 35
  • 37. Wire Tap public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:a") .to("log:com.mycompany.messages?level=info") .to("mock:foo"); } } Java DSL 37
  • 38. Content Enricher public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:My.Queue") .to("velocity:com/acme/MyResponse.vm") .to("activemq:Another.Queue"); } } Java DSL 38
  • 39. More Content Enricher public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:My.Queue") .beanRef("myPojo", “methodName”) .to("activemq:Another.Queue"); } } Java DSL 39
  • 40. Content Filter public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:start").process(new Processor() { public void process(Exchange exchange) { Message in = exchange.getIn(); in.setBody(in.getBody(String.class) + " World!"); } }).to("mock:result"); } } Java DSL 40
  • 41. Combine Patterns public class MyRouteBuilder extends RouteBuilder { public void configure() { from("seda:a”). resequencer(header("JMSGroupSeq")). delayer(3000). to("mock:x"); } } Java DSL 41
  • 42. Error Handling in Camel :: Global Error Handler: RouteBuilder builder = new RouteBuilder() {     public void configure() {         errorHandler(deadLetterChannel("file:errors"));         from("bean:foo").to("seda:b");   } }; :: Local Error Handler: RouteBuilder builder = new RouteBuilder() {     public void configure() {       from("seda:a").         errorHandler(loggingErrorHandler("FOO.BAR")).         to("seda:b");       from("seda:b").to("seda:c");   } Java DSL }; 42
  • 43. Exception Policies in Camel RouteBuilder builder = new RouteBuilder() {     public void configure() {         exception(IOException.class)           .initialRedeliveryDelay(5000L)           .maximumRedeliveries(3)           .maximumRedeliveryDelay(30000L)           .backOffMultiplier(1.0)           .useExponentialBackOff()           .setHeader(MESSAGE_INFO, constant("Damned IOException!"))           .to("activemq:errors");         from("seda:a").to("seda:b");    } };  Java DSL 43
  • 44. Make Context Discover Beans 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> 44
  • 45. Bean as a Message Translator public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:Incoming”). beanRef("myBean"). to("activemq:Outgoing"); } } Java DSL 45
  • 46. Bean as a Message Translator *With Method Name public class MyRouteBuilder extends RouteBuilder { public void configure() { from("activemq:Incoming”). beanRef("myBean", "someMethod"). to("activemq:Outgoing"); } } Java DSL 46
  • 47. Binding Beans to Camel Endpoints public class Foo { @MessageDriven(uri=”activemq:cheese”) public void onCheese(String name) { ... } } Java DSL 47
  • 48. Binding Method Arguments public class Foo { public void onCheese( @XPath(“/foo/bar/”) String name, @Header(“JMSCorrelationID”) String id) { ... } } Java DSL 48
  • 49. Injecting Endpoints Into Beans public class Foo { @EndpointInject(uri= “activemq:foo.bar”) ProducerTemplate producer; public void doSomething() { if (whatever) { producer.sendBody(“<hello>world</hello>”); } } } Java DSL 49
  • 50. Type Convertors public class MyRouteBuilder extends RouteBuilder { public void configure() { from("direct:start").process(new Processor() { public void process(Exchange exchange) { Message in = exchange.getIn(); in.setBody(in.getBody(String.class) + " World!"); } }).to("mock:result"); } } Support for the following types: • File • String • byte[] and ByteBuffer • InputStream and OutputStream • Reader and Writer • Document and Source 50
  • 51. Type Conversion @Converter public class IOConverter { @Converter public static InputStream toInputStream(File file) throws FileNotFoundException { return new BufferedInputStream( new FileInputStream(file)); } } 51
  • 52. Business Activity Monitoring (BAM) 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"); } } 52
  • 54. Ride the Camel! http://camel.apache.org/ [email protected] http://twitter.com/brucesnyder 54