• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Integration camel
 

Integration camel

on

  • 325 views

 

Statistics

Views

Total Views
325
Views on SlideShare
325
Embed Views
0

Actions

Likes
1
Downloads
5
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Integration camel Integration camel Presentation Transcript

    • © OPITZ CONSULTING GmbH 2010 Seite 1Integration mit Apache CamelDr. Ralf Sigmund, BereichsleiterOPITZ CONSULTING Hamburg GmbHHamburg, 02.03.2011Integration mit Apache Camel
    • © OPITZ CONSULTING GmbH 2010 Seite 2Integration mit Apache CamelAgenda1. Enterprise Integration Patterns2. Einführung in Apache Camel3. Ein Beispiel4. Weitere Patterns5. Beans
    • © OPITZ CONSULTING GmbH 2010 Seite 3Integration mit Apache Camel1 Enterprise Integration Patterns
    • © OPITZ CONSULTING GmbH 2010 Seite 4Integration mit Apache CamelEnterprise Integration Patterns (EIP) (1) Bewährte Lösungsschablonen für Integrationsszenarien aufBasis asynchronen Nachrichtenaustauschs Muster beschreiben Lösung von Problemen, die bei derIntegration heterogener Anwendungen aufunterschiedlichen Plattformen auftreten. Definition einer grafischen NotationTitel: Enterprise Integration PatternsAutor: Gregor Hohpe, Bobby WoolfVerlag: Addison-WesleyISBN: 0321200683
    • © OPITZ CONSULTING GmbH 2010 Seite 5Integration mit Apache CamelEnterprise Integration Patterns (2) Musterkatalog besteht aus 65 Integration Patterns Die Muster lassen sich in verschiedenen Kategorienunterteilen Message Construction Message Endpoints Message Channels Message Routing Message Transformation System Management
    • © OPITZ CONSULTING GmbH 2010 Seite 6Integration mit Apache Camel2 Einführung in Apache Camel
    • © OPITZ CONSULTING GmbH 2010 Seite 7Integration mit Apache CamelEnterprise Integration mit Apache Camel Open Source Integrations Framework Subprojekt von ApacheMQ Umsetzung eines Großteils der Enterprise IntegrationPatterns Ermöglicht die Definition von Routing- undKonvertierungsregeln in Java oder Scala auf Basis einer domänenpezifischen Sprache (DSL) bzw. Spring basierter XML-KonfigurationTitel: Camel In ActionAutor: Claus Ibsen, Jonathan AnsteyVerlag: ManningISBN: 9781935182368
    • © OPITZ CONSULTING GmbH 2010 Seite 8Integration mit Apache CamelApache Camel (Architektur) Zentraler Punkt der Camel-Architektur: CamelContext Hier registrieren sich sämtliche Komponenten und erhalteneine eindeutige Adresse in Form einer URIAus: Ibsen, Anstey: Camel in Action, Manning 2010
    • © OPITZ CONSULTING GmbH 2010 Seite 9Integration mit Apache CamelApache Camel (Komponenten) Camel stellt eine Vielzahl an Komponenten zur Verfügung(über 80), die unterschiedliche Transportprotokolle und –formate sowie eine Reihe von Bindings anbieten http://camel.apache.org/components.html Beispiele für Komponenten: JMS-Komponente: erlaubt das Senden (bzw. Konsumieren) von Nachrichtenan eine JMS-Queue oder –Topic JDBC-Komponente: Verbindung mit Datenbanken via JDBC und Absetzenvon SQL-Statements JPA-Komponente: erlaubt das Speichern und Abfragen von Objekten (ORM) File-Komponente: ermöglicht das Laden und Speichern im Dateisystem FTP-Komponente: erlaubt den Zugriff auf entfernte Dateisysteme über FTP HTTP-Komponente: Http-Client für den Aufruf externer Server Direct-Komponente: direkter, synchroner Aufruf eines beliebigen Endpunktes
    • © OPITZ CONSULTING GmbH 2010 Seite 10Integration mit Apache CamelApache Camel (Endpunkte) Endpunkte arbeiten wahlweise als Consumer (in-only) oderProducer (out) Consumer nehmen Nachrichten entgegen Producer erzeugen Nachrichten es ist aber auch möglich beide Rollen einzunehmen (in-out) Endpunkte werden durch protokollspezifische Factorieserzeugt und im Laufzeit-Container registriert(CamelContext).
    • © OPITZ CONSULTING GmbH 2010 Seite 11Integration mit Apache CamelCamel (Routenbildung) Routenbildung (Camel-Route) erfolgt über eine bestimmteAnzahl von RouteBuildern, die dem CamelContexthinzugefügt werden Zur Festlegung der Routen zwei Möglichkeiten: Definition über Java-basierte domänenspezifische Sprache (DSL) Spring basierte XML Bei der DSL handelt es sich um eine Inline DSL, der dasBuilder-Pattern zugrunde liegt Durch Verkettung von Methoden wird eine Route(Nachrichtenfluss) definiert.
    • © OPITZ CONSULTING GmbH 2010 Seite 12Integration mit Apache Camel3 Ein Beispiel
    • © OPITZ CONSULTING GmbH 2010 Seite 13Integration mit Apache CamelBeispielmuster: Message-Filter spezielle Art eines Routers es werden nur Nachrichten weitergeleitet, deren Inhaltbestimmte Kriterien erfüllt hat nur einen output-ChannelNachrichtTyp ANachrichtTyp ANachrichtTyp ANachrichtTyp ANachrichtTyp BMessageFiilter
    • © OPITZ CONSULTING GmbH 2010 Seite 14Integration mit Apache CamelBeispielmuster: Message Filter (Java) Java-Klassen müssen die Basisklasseorg.apache.camel.builder.RouteBuilder erweitern und dieRoutenlogik in der configure-Methode bereitstellenpublic class MyRouteBuilder extends RouteBuilder {public void configure() throws Exception {from("activemq:topic:Quotes").filter().xpath("/quote/product=widget").to("mqseries:WidgeQuotes");}}
    • © OPITZ CONSULTING GmbH 2010 Seite 15Integration mit Apache CamelBeispielmuster: Message Filter (Java) Endpunkt A nimmt eine Nachricht aus einer Queueentgegen (from). Diese wird anschließend verarbeitet und anden Endpunkt B weitergeleitet (to).public class MyRouteBuilder extends RouteBuilder {public void configure() throws Exception {Endpoint A = endpoint("activemq:topic:Quotes");Endpoint B = endpoint("mqseries:WidgeQuotes");Predicate isWidget = xpath("/quote/product= widget");from(A).filter(isWidget).to(B);}}
    • © OPITZ CONSULTING GmbH 2010 Seite 16Integration mit Apache CamelBeispielmuster: Message Filter(Spring XML) Der CamelContext wird innerhalb des Beans-Tags in denApplicationContext eingtragen in der XML-Definition finden sich den Methoden derJava-DSL entsprechende Tags wieder<camelContext xmlns="http://camel.apache.org/schema/spring"><route><from uri="activemq:topic:Quotes"><filter><xpath>/quote/product=widget</xpath></filter></from><to uri="mqseries:WidgeQuotes"></to></route></camelContext>
    • © OPITZ CONSULTING GmbH 2010 Seite 17Integration mit Apache CamelAusführung in einer Java-Anwendung CamelContext kann programmatisch erzeugt werden Keine zusätzlichen Bibliotheken / Frameworks notwendigCamelContext context = new DefaultCamelContext();context.addRoutes(new MyRouteBuilder());context.start();
    • © OPITZ CONSULTING GmbH 2010 Seite 18Integration mit Apache CamelCamelContext in Spring Package-Tag: Package, in dem nach Route-Buildern gesuchtwerden soll => Routendefinition in Java ist auch möglich,wenn Spring genutzt wird PropertyPlaceholder-Tag: Verweis auf eine properties-Datei,auf die in Routendefinitionen zugegriffen werden kann<camelContext xmlns="http://camel.apache.org/schema/spring"><propertyPlaceholder id="properties"location="classpath:camel-prod.properties"/><package>com.acme.quotes</package></camelContext>
    • © OPITZ CONSULTING GmbH 2010 Seite 19Integration mit Apache Camel4 Weitere Patterns
    • © OPITZ CONSULTING GmbH 2010 Seite 20Integration mit Apache CamelContent Based Router Untersuchen des Inhaltes der Nachricht Weiterleitung in verschiedene Kanäle in Abhängigkeit vonihrem Inhalt Kann auf verschiedenen Kriterien basieren (z.B.Vorhandensein bestimmter Felder, Inhalt von Feldern…)NeuerAuftragRouterEndpunkt AEndpunkt B
    • © OPITZ CONSULTING GmbH 2010 Seite 21Integration mit Apache CamelContent Based Router Abarbeiten eines Auftrags aus der Queue Überprüfen der Nachricht (XML) anhand eines XPath-AusdrucksRouteBuilder builder = new RouteBuilder() {public void configure() {from("activemq:Auftraege").choice().when(xpath("/order/product").isEqualTo("produktA")).to("direct:A").when(xpath("/order/product").isEqualTo("produktB")).to("direct:B").otherwise().to("direct:C");}};
    • © OPITZ CONSULTING GmbH 2010 Seite 22Integration mit Apache CamelContent Based Router<camelContext xmlns="http://camel.apache.org/schema/spring"><route><from uri="activemq:Auftraege" /><choice><when><xpath>/order/product = produktA</xpath><to uri="direct:A" /></when><when><xpath>/order/product = produktB</xpath><to uri="direct:B" /></when><otherwise><to uri="direct:C" /></otherwise></choice></route></camelContext>
    • © OPITZ CONSULTING GmbH 2010 Seite 23Integration mit Apache CamelSplitter Empfängt eine Nachricht mit wiederkehrenden Elementen,die separat verarbeitet werden können Für jedes Element (oder jede Teilmenge) derUrsprungsnachricht wird eine neue Nachricht erzeugtNeuerAuftrag SplitterAuftragsposition1Auftragsposition2Auftragsposition3
    • © OPITZ CONSULTING GmbH 2010 Seite 24Integration mit Apache CamelSplitter Laden von Aufträgen aus dem Dateisystem Nachricht (als String) wird zeilenweise zerlegt Entstehende Nachrichten werden an eine Queue gesandtRouteBuilder builder = new RouteBuilder() {public void configure() {from("file://Auftraege").split(body(String.class).tokenize("n")).to("activemq:Auftraege.Positionen");}};
    • © OPITZ CONSULTING GmbH 2010 Seite 25Integration mit Apache CamelSplitter Laden von Nachrichten aus dem Dateisystem Nachricht (XML-Format) wird anhand eines XPath-Ausdrucks zerlegt Senden an eine Queue<camelContext xmlns="http://camel.apache.org/schema/spring"><route><from uri="file://Auftraege" /><split><xpath>/auftrag/positionen</xpath><to uri="activemq:Auftraege.Positionen /></split></route></camelContext>
    • © OPITZ CONSULTING GmbH 2010 Seite 26Integration mit Apache CamelMessage Translator Ermöglicht Kommunikation zwischen Systemen mitverschiedenen Datenformaten Konvertiert eine Nachricht in das Format eines PartnersEingehendeNachrichtUmgeformteNachrichtTranslator
    • © OPITZ CONSULTING GmbH 2010 Seite 27Integration mit Apache CamelMessage Translator Transformation einer XML-Nachricht mithilfe eines XSL-Templates XSLT-Komponente erhält als Parameter den Pfad zum XSL-TemplateRouteBuilder builder = new RouteBuilder() {public void configure() {from("file://Auftraege").to("xslt:com/acme/mytransform.xsl").to("activemq:Auftraege");}};
    • © OPITZ CONSULTING GmbH 2010 Seite 28Integration mit Apache CamelMessage Translator Transformation kann alternativ durch (hier anonyme)Implementierung eines Processors geschehen Durch Parameter exchange Zugriff auf eingehende (In) undausgehende (Out) Nachricht Beliebige Ausführung von Java-Code möglichfrom("file://Auftraege").process(new Processor() {public void process(Exchange exchange) {Message in = exchange.getIn();in.setBody(in.getBody(String.class) + " World!");}}).to("activemq:Auftraege");
    • © OPITZ CONSULTING GmbH 2010 Seite 29Integration mit Apache CamelMessage Translator Anhängen von ‚extra data!‘ im transform-tag Statt Simple kann eine Vielzahl weiterer ExpressionLanguages genutzt werden, wie beispielsweise Java Script,Groovy, EL, XPath<camelContext xmlns="http://camel.apache.org/schema/spring"><route><from uri="file://Auftraege" /><transform><simple>${in.body} extra data!</simple></transform><to uri="activemq:Auftraege" /></route></camelContext>
    • © OPITZ CONSULTING GmbH 2010 Seite 30Integration mit Apache Camel5 Beans
    • © OPITZ CONSULTING GmbH 2010 Seite 31Integration mit Apache CamelMessage Translator: Bean Nutzung einer Java Bean, falls komplexe Logik fürTransformation benötigt (z.B. DB-Zugriff, Schleifen) Vorteil: Routenbeschreibung bleibt übersichtlich unddeklarativ, Logik wird ausgelagert Bean-Komponente erhält als Parameter den Namen derBean und den Methodennamen Ist kein Methodenname angegeben oder wurde die Methode überladen, wirdversucht, anhand der Nachricht die richtige Methode zu ermitteln Bean muss im Spring-Context oder im JNDI-Contextregistriert werdenfrom("file://Auftraege").to("bean:ConverterBean?method=convertOrder").to("activemq:Auftraege");
    • © OPITZ CONSULTING GmbH 2010 Seite 32Integration mit Apache CamelDie Bean Rückgabe der convertOrder-Methode wird an den Body derNachricht gebunden Mittels der @Header-Annotation wird der Header‚headerName‘ an den Parameter header gebunden Mittels der @XPath-Annotation wird die Nachricht mit einemXPath-Ausdruck ausgewertet und das Ergebnis an denParameter auftragsNummer gebundenpublic class ConverterBean {@Consume(uri = "activemq:Auftraege")public String convertOrder(@Header(value = "headerName")String header, @XPath(value = "/auftrag/nummer")String auftragsNummer) {return header + auftragsNummer;}}
    • © OPITZ CONSULTING GmbH 2010 Seite 33Integration mit Apache CamelTyp-Konvertierung Camel unterstützt eine ganze Reihe von Konvertierungen„out of the box“ Bei Bedarf können eigene Konverter implementiert werden Hinzufügen der @Converter-Annotation zur Klasse und Methode Eintragen der Packages mit Konverter-Klassen in META-INF/services/org/apache/camel/TypeConverter@Converterpublic class IOConverter {@Converterpublic static InputStream toInputStream(File file)throws FileNotFoundException {return new BufferedInputStream(newFileInputStream(file));}}
    • © OPITZ CONSULTING GmbH 2010 Seite 34Integration mit Apache CamelBeans an Endpunkte binden Eine einfache Alternative zur Definition einer komplettenRoute Durch die @Consume-Annotation wird die Methode an denals Parameter übergebenen Endpunkt gebunden Beim Eintreffen einer neuen Nachricht wird die Methode mitder Nachricht als Parameter aufgerufenpublic class AuftragsBean {@Consume(uri = "activemq:Auftraege")public void pruefeAuftrag(String body) {...}}
    • © OPITZ CONSULTING GmbH 2010 Seite 35Integration mit Apache CamelNachrichten an Endpunkte senden Durch die @Produce-Annotation wird der Bean einProducer-Template injiziert, mit dessen Hilfe Nachrichten anden jeweiligen Endpunkt gesendet werden können Weitere Methoden verfügbar (z.B. senden von Headern) (Nachteil: Aufrufer wird vom Camel-API abhängig; kanndurch ein Interface versteckt werden)public class SenderBean {@Produce(uri = "activemq:Auftraege")ProducerTemplate template;public void sendeNachricht() {template.sendBody("Nachricht");}}
    • © OPITZ CONSULTING GmbH 2010 Seite 36Integration mit Apache CamelTesten Spezielle Komponente: Mock-Endpoints Abstrakte Klasse CamelTestSupport Formulieren von Erwartungen und Assertions für Mock-Endpunkte Zugriff auf Nachrichten, die an Mock-Endpunkteneingegangen sind
    • © OPITZ CONSULTING GmbH 2010 Seite 37Integration mit Apache CamelTesten: Testklassepublic class FilterTest extends CamelTestSupport {@EndpointInject(uri = "mock:result")protected MockEndpoint resultEndpoint;@Produce(uri = "direct:start")protected ProducerTemplate template;@Overrideprotected RouteBuilder createRouteBuilder() {return new RouteBuilder() {public void configure() {from("direct:start").filter(header("auftragsNummer").isEqualTo("1")).to("mock:result");}};}}
    • © OPITZ CONSULTING GmbH 2010 Seite 38Integration mit Apache CamelTesten: Testmethodenpublic void testSendMatchingMessage() throws Exception {String expectedBody = "<matched/>";resultEndpoint.expectedBodiesReceived(expectedBody);template.sendBodyAndHeader(expectedBody,"auftragsNummer", "1");resultEndpoint.assertIsSatisfied();}public void testSendNotMatchingMessage() throws Exception {resultEndpoint.expectedMessageCount(0);template.sendBodyAndHeader("<notMatched/>","auftragsNummer", "2");resultEndpoint.assertIsSatisfied();}
    • © OPITZ CONSULTING GmbH 2010 Seite 39Integration mit Apache CamelQuellen und weiterführende Links http://camel.apache.org/enterprise-integration-patterns.html http://www.enterpriseintegrationpatterns.com/ http://camel.apache.org/components.html
    • © OPITZ CONSULTING GmbH 2010 Seite 40Integration mit Apache CamelFragen und Antworten