MockEndpoint

Werbung
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.
Herunterladen