Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Integration camel

1,154 views

Published on

  • Be the first to comment

Integration camel

  1. 1. © OPITZ CONSULTING GmbH 2010 Seite 1Integration mit Apache CamelDr. Ralf Sigmund, BereichsleiterOPITZ CONSULTING Hamburg GmbHHamburg, 02.03.2011Integration mit Apache Camel
  2. 2. © OPITZ CONSULTING GmbH 2010 Seite 2Integration mit Apache CamelAgenda1. Enterprise Integration Patterns2. Einführung in Apache Camel3. Ein Beispiel4. Weitere Patterns5. Beans
  3. 3. © OPITZ CONSULTING GmbH 2010 Seite 3Integration mit Apache Camel1 Enterprise Integration Patterns
  4. 4. © 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
  5. 5. © 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
  6. 6. © OPITZ CONSULTING GmbH 2010 Seite 6Integration mit Apache Camel2 Einführung in Apache Camel
  7. 7. © 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
  8. 8. © 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
  9. 9. © 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
  10. 10. © 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).
  11. 11. © 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.
  12. 12. © OPITZ CONSULTING GmbH 2010 Seite 12Integration mit Apache Camel3 Ein Beispiel
  13. 13. © 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
  14. 14. © 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");}}
  15. 15. © 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);}}
  16. 16. © 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>
  17. 17. © 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();
  18. 18. © 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>
  19. 19. © OPITZ CONSULTING GmbH 2010 Seite 19Integration mit Apache Camel4 Weitere Patterns
  20. 20. © 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
  21. 21. © 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");}};
  22. 22. © 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>
  23. 23. © 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
  24. 24. © 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");}};
  25. 25. © 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>
  26. 26. © 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
  27. 27. © 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");}};
  28. 28. © 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");
  29. 29. © 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>
  30. 30. © OPITZ CONSULTING GmbH 2010 Seite 30Integration mit Apache Camel5 Beans
  31. 31. © 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");
  32. 32. © 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;}}
  33. 33. © 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));}}
  34. 34. © 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) {...}}
  35. 35. © 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");}}
  36. 36. © 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
  37. 37. © 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");}};}}
  38. 38. © 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();}
  39. 39. © 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
  40. 40. © OPITZ CONSULTING GmbH 2010 Seite 40Integration mit Apache CamelFragen und Antworten

×