Taking Apache Camel For A Ride

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    3 Favorites

    Taking Apache Camel For A Ride - Presentation Transcript

    1. Taking Apache Camel For A Ride Bruce Snyder bsnyder@apache.org 7 Nov 2008 New Orleans, Louisiana
    2. Protocol Integration is Common
    3. Data Format Integration is Common
    4. Integration is Messy!
    5. SOA = Spaghetti Oriented Architecture
    6. Options For Integration 1 2 3
    7. Too Many Choices!
    8. The Easiest Solution - Apache Camel http://activemq.apache.org/camel/
    9. What is Apache Camel?
    10. Enterprise Integration Patterns http://enterpriseintegrationpatterns.com/
    11. Message Routing
    12. Patterns
    13. History of Apache Camel
    14. Camel Components http://activemq.apache.org/camel/components.html
    15. Camel Components
    16. Simple Routing
    17. More Simple Routing
    18. Pipeline Routing
    19. Multicast Routing
    20. Multicast-to-Many Pipeline Routes
    21. Language Support For Message Processing • BeanShell • JSP EL • Javascript • OGNL • Groovy • SQL • Python • XPath • PHP • XQuery • Ruby
    22. Getting Started - The Camel Context CamelContext context = new DefaultCamelContext(); context.addRoutes(new MyRouteBuilder()); context.start(); <camelContext xmlns=\"http://activemq.apache.org/camel/schema/spring\"> <package>com.acme.quotes</package> </camelContext>
    23. Pattern Examples
    24. Patterns
    25. 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\"); } };
    26. 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>
    27. Message Filter public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:topic:Quotes). filter().xpath(\"/quote/product = ‘widget’\"). to(\"mqseries:WidgetQuotes\"); } }
    28. Message Filter <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>
    29. Splitter public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"file://orders\"). splitter(body().tokenize(\"\\n\")). to(\"activemq:Order.Items\"); } }
    30. Splitter Using XQuery public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"file://orders\"). splitter().xquery(\"/order/items\"). to(\"activemq:Order.Items\"); } }
    31. Aggregator public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:Inventory.Items\"). aggregator(header(\"symbol\").isEqualTo(\"IBM\"). to(\"activemq:Inventory.Order\"); } }
    32. Message Translator public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"file://incoming”). to(\"xslt:com/acme/mytransform.xsl\"). to(\"http://outgoing.com/foo\"); } }
    33. Resequencer public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"direct:a”). resequencer(header(\"customerRank\")). to(\"seda:b\"); } }
    34. Routing Slip public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"direct:a”).routingSlip(); } }
    35. Throttler public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"seda:a”). throttler(3).timePeriodMillis(30000). to(\"seda:b\"); } }
    36. Delayer public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"seda:a”). delayer(header(\"JMSTimestamp\", 3000). to(\"seda:b\"); } }
    37. Load Balancer public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"file:/path/to/file\"). loadBalance().roundRobin(). to(\"seda:a\", \"seda:b\", \"seda:c\"); } } 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 (like a JMS topic)
    38. Multicast public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"direct:a\"). multicast(). to(\"direct:x?x=y&amp;1=2\", \"direct:y\", \"direct:z\"); } }
    39. Demo
    40. More Patterns
    41. Wire Tap public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"direct:a\"). to(\"log:com.mycompany.messages?level=info\"). to(\"mock:foo\"); } }
    42. Content Enricher public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:My.Queue\"). to(\"velocity:com/acme/MyResponse.vm\"). to(\"activemq:Another.Queue\"); } }
    43. More Content Enricher public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:My.Queue\"). beanRef(\"myBeanName\", \"myMethodName\"). to(\"activemq:Another.Queue\"); } }
    44. 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\"); } }
    45. Combine Patterns public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"seda:a”). resequencer(header(\"JMSGroupSeq\")). delayer(3000). to(\"mock:x\"); } }
    46. Configure Error Handling Global Error Handler: RouteBuilder builder = new RouteBuilder() { public void configure() { errorHandler(deadLetterChannel(\"file:errors\")); from(\"bean:foo\").to(\"seda:b\"); } };
    47. Configure Error Handling 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\"); } };
    48. Configure Exception Policies 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\"); } };
    49. Beans
    50. 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>
    51. Bean as a Message Translator public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:Incoming”). beanRef(\"myBean\"). to(\"activemq:Outgoing\"); } }
    52. 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\"); } }
    53. Binding Beans to Camel Endpoints public class Foo { @MessageDriven(uri=\"activemq:cheese\") public void onCheese(String name) { ... } }
    54. Binding Method Arguments public class Foo { public void onCheese( @XPath(\"/foo/bar\") String name, @Header(\"JMSCorrelationID\") String id) { ... } }
    55. Injecting Endpoints Into Beans public class Foo { @EndpointInject(uri=\"activemq:foo.bar\") ProducerTemplate producer; public void doSomething() { if (whatever) { producer.sendBody(\"<hello>world!</hello>\"); } } }
    56. Type Conversion
    57. Type Conversion @Converter public class IOConverter { @Converter public static InputStream toInputStream(File file) throws FileNotFoundException { return new BufferedInputStream( new FileInputStream(file)); } }
    58. 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
    59. Message Mapper
    60. Message Translator public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"file://incoming”). to(\"xslt:com/acme/mytransform.xsl\"). to(\"http://outgoing.com/foo\"); } }
    61. Another Message Translator public class MyRouteBuilder extends RouteBuilder { public void configure() { from(\"activemq:FOO.TEST”). transform(body().append(getDynamicText())). to(\"http://outgoing.com/foo\"); } }
    62. Business Activity Monitoring (BAM)
    63. 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\"); } }
    64. Complex Routing is Easier from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”)); from((“activemq:queue:requests?transacted=true”). process(requestTransformer). to(“http://host:8080/Request”). filter(xpath(“//nack”)). process(nackTransformer). to(“jdbc:store”); from(“http://localhost:8080/responses/”). tryBlock(). to(“activemq:queue:responses”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”)); from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”); from(“http://localhost:8080/pull/”). to(“jdbc:load”);
    65. Finally, the Camel Truck!
    66. Ride the Camel! http://activemq.apache.org/camel/

    + Bruce SnyderBruce Snyder, 2 years ago

    custom

    1487 views, 3 favs, 0 embeds more stats

    Presentation from ApacheCon US 2008

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 1487
      • 1487 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 3
    • Downloads 51
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories