Gemusterte Kamele Systemintegration mit Java und Apache Camel Tobias Israel | [email protected] □ Die Monolithen sterben aus! □ Eine Applikation = Viele Applikationen ■ Interaktion ■ Kooperation ■ Verfügbarkeit ■ ... □ Austausch von Dateien über das Dateisystem □ Gemeinsame Datenbank □ Entfernter Methodenaufruf Alternative? Messaging! □ Message Bus □ Messaging Bridge □ Channel Adapder □ Dead Letter / Invalid Message Channel □ ... □ Fire and Forget Sender Empfänger □ Store and Forward Sender Empfänger Die Pro‘s □ Keine technologischen Details bei der Implementierung □ Plattform- und sprachübergreifende Integration leicht umzusetzen □ Asynchrone Kommunikation ■ Maximaler Durchsatz aller Systeme möglich ■ Möglichkeit zur Steuerung von Überlastsituationen ■ Relieability mithilfe von Store and Forward ■ Offlinemodus der Applikation realisierbar Die Kontras □ Komplexeres Programmiermodell □ Erschwertes Debugging □ Problem mit Abhängigkeiten zwischen einzelnen Nachrichten □ Massendatenverarbeitung/-transfer nicht performant □ Vendor lock-in über spezielle Middlewarelösungen ... wenn man sich was wünschen dürfte ... □ Architekturmuster für Messaging-Infrastruktur □ Aufbau und Erzeugung von Nachrichten □ Steuerung des Nachrichtentransports □ Ggf. Konvertierung von Nachrichten in verschiedene Formate □ Endpunktverhalten/-strategien □ Überwachung und Steuerung Enterprise Integration Pattern □ Musterkatalog für Integrationsszenarien auf Basis asynchronen Datenaustauschs □ Gängige Probleme werden auf konzeptioneller Ebene betrachtet und eine (Lösungs-)Struktur vorgegeben □ Definition einer grafischen Notation zur Beschreibung/Dokumentation Notation □ Nachrichtenkanal □ Nachricht □ Komponente Musterkatalog Messaging Endpoints ‣ Message Endpoint ‣ Message Gateway ‣ Durable Subscriber ‣ ... Messageing Channels Message Routing ‣ Publish Subscribe Channel ‣ Message Bus ‣ Guaranteed Delivery ‣ ... ‣ Content-Based Router ‣ Message Filter ‣Splitter ‣ ... App.1 Message Construction ‣ Message ‣ Command Message ‣ Correlation Identifier ‣ ... App. 2 System Management Message Transformation ‣ Message Translator ‣ Normalizer ‣ Content Filter ‣ ... ‣ Control Bus ‣ Wire Tap ‣ Message Store ‣ ... Message Construction Command Message Event Message Document Message Return Address Correlation Identifier Message Expiration Messaging Channels Point-to-Point Channel Publish-Subscribe Channel Datatype Channel Invalid Message Channel Dead Letter Channel Guaranteed Delivery Channel Adapter Message Bus Message Routing Content-Based Router Message Filter Dynamic Router Splitter Aggregator Composed Message Processor Message Transformation Envelope Wrapper Normalizer Messaging Endpoints Polling Consumer Event-Driven Consumer Message Dispatcher System Management Wire Tap Test Message □ Vorgefertigte Implementierung für die meisten Muster des Enterprise Integration Pattern Kataloges □ Subprojekt von Apache ActiveMQ □ Aktueller Versionsstand 2.8.3 □ Apache License 2.0 l e Camel Runtime Routerprocessor m a Camel Processors Filterprocessor JMS File C FTP Camel Components Mail Integration Context JMSProvider Filesystem Browser Arbeiten mit Camel □ Mitgelieferte Komponenten □ Konfiguration (fast) ohne Coding □ Fluent API □ Spring Beans XML □ Camel Laufzeitumgebung □ Standalone □ Integration in ActiveMQ □ Integration in ServiceMix □ Integration in OpenESB □ ... Verfügbare Komponenten (ein Auszug) □ activemq-camel □ camel-atom □ camel-cxf □ camel-core (File, Log, ...) □ camel-ftp □ ... Ausdrücke formulieren □ XPath □ XQuery □ Groovy □ BeanShell □ SQL □ ... Integration „in the small“ ... also gewöhnliches Javacoding □ Camel Laufzeitumgebung starten □ Endpunkte direkt im Code ergänzen CamelContext camelContext = new DefaultCamelContext(); ProducerTemplate template = camelContext.createProducerTemplate(); camelContext.addComponent("log", new LogComponent()); camelContext.addComponent("file", new FileComponent()); camelContext.start(); template.sendBody("log:com.buschmais.part2.easy", "Log this message"); template.sendBodyAndHeader("file://target/subfolder", "Save this message", FileComponent.HEADER_FILE_NAME, "CamelIntegration.log"); Eventhandling □ Bindung an einen definierten Endpunkt □ Konfiguration Endpoint endpoint = camelContext.getEndpoint("file://target/subfolder? consumer.initialDelay=8000"); Consumer fileConsumer = endpoint.createConsumer(new Processor() { public void process(Exchange exchange) throws Exception { template.sendBody("log:com.buschmais.integration", "New File detected."); } }); fileConsumer.start(); Integration „in the large“ □ Strikte Separation von Nachrichtenverarbeitung und Nachrichtentransport □ Definition von Routings (+ ggf. Metadaten der Nachricht) ■ Fluent API = Konfiguration auf die gute alte Java-Tour ■ Integration mit Spring und entsprechender Erweiterung der XML Bean-Definition Beispiel: Content Based Router Fluent-API public void configure() throws Exception { from("file://tmp/stat.xml").choice(). when(XPathBuilder.xpath("/Status/Priority = ’SEVERE’")). to("smtp://[email protected]:25?password=somepass"). when(XPathBuilder.xpath("/Status/Priority = ’NORMAL’")). to("smpt://[email protected]:25?password=somepass"). otherwise().to("log:com.buschmais.integration.camel"); } Spring XML Konfiguration <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="file://tmp/stat.xml" /> <choice> <when> <xpath>/Status/Priority = 'SEVERE'</xpath> <to uri="smtp://[email protected]:25?password=somepass" /> </when> <when> <xpath>/Status/Priority = 'NORMAL'</xpath> <to uri="smpt://[email protected]:25?password=somepass" /> </when> <otherwise> <to uri="log:com.buschmais.integration.camel" /> </otherwise> </choice> </route> </camelContext> Testunterstützung/-integration □ MockComponent & MockEndpoint CamelContext camelContext = new DefaultCamelContext(); MockEndpoint mockEP = camelContext.getEndpoint("mock:checkA", MockEndpoint.class); mockEP.expectedBodiesReceived("MessageId", "MessageRefId", "Priority"); mockEP.expectedMinimumMessageCount(2); mockEP.assertIsNotSatisfied(); □ Unterstützung von JUnit-Tests mit viel Basisfunktionalität in Klasse ContextTestSupport Tooling □ Plugin für Apache Maven ■ Ausführen der Laufzeitumgebung ■ Erstellen von Dokumentation entsprechend EIP-Pattern <groupId>org.apache.camel</groupId> <artifactId>camel-maven-plugin</artifactId> Live-Demo Webservice Translator Message Store ... was noch zu sagen bleibt ... □ Messaging ist ein alter (aber guter) Hut □ Im Projektalltag leider oft: ■ unstrukturiertes Vorgehen ■ Integration auf Mikroebene ■ viel handgestrickter Code ■ wenig Kontrolle über Integrationsumgebung □ Enterprise Integration Patter können in vielen Fällen den Rahmen für erfolgreiche(re) Integrationsprojekte geben ■ Ausdrucksmittel für Integrationsaufplanung ■ Leitfaden für Realisierung □ Apache Camel bietet eine gute Basis ohne viel Handgestricktes nach den Integrationsmustern zu arbeiten Vielen Dank. Referenzen Enterprise Integration Pattern: Gregor Hohpe, Bobby Woolf; Addison-Wesley, 2004 Enterprise Integration Pattern Website: http://www.eaipatterns.com/ Apache Camel Website: http://camel.apache.org/ buschmais.de facebook.com/buschmais twitter.com/buschmais Impressum buschmais GbR, Leipziger Straße 93, 01127 Dresden | Telefon +49 (0) 351 3209 23-0 | Telefax +49 (0) 351 3209 23-29 | E-Mail [email protected] | Internet www.buschmais.de | USt-IdNr. DE258776789 |! Inhaber Torsten Busch, Frank Schwarz, Dirk Mahler und Tobias Israel 'buschmais' ist eine eingetragene Marke der buschmais GbR. Ihre Verwendung im Geschäftsverkehr ist nur bei ausdrücklicher, schriftlicher Erlaubnis der buschmais GbR statthaft. Andere in dieser Präsentation erwähnten Geschäftsbezeichnungen, Produkt- oder Dienstleistungsnamen sind Marken ihrer Besitzer. Trotz genauer Prüfung der zur Verfügung gestellten Informationen übernimmt die buschmais GbR keine Haftung für Bearbeitungsfehler oder Auslassungen. Grafiken zu Enterprise Integration Patterns (http://www.eaipatterns.com) unterliegen der Creative Commons Attribution Lizenz.