SlideShare una empresa de Scribd logo
1 de 40
© OPITZ CONSULTING GmbH 2010 Seite 1Integration mit Apache Camel
Dr. Ralf Sigmund, Bereichsleiter
OPITZ CONSULTING Hamburg GmbH
Hamburg, 02.03.2011
Integration mit Apache Camel
© OPITZ CONSULTING GmbH 2010 Seite 2Integration mit Apache Camel
Agenda
1. Enterprise Integration Patterns
2. Einführung in Apache Camel
3. Ein Beispiel
4. Weitere Patterns
5. Beans
© OPITZ CONSULTING GmbH 2010 Seite 3Integration mit Apache Camel
1 Enterprise Integration Patterns
© OPITZ CONSULTING GmbH 2010 Seite 4Integration mit Apache Camel
Enterprise Integration Patterns (EIP) (1)
 Bewährte Lösungsschablonen für Integrationsszenarien auf
Basis asynchronen Nachrichtenaustauschs
 Muster beschreiben Lösung von Problemen, die bei der
Integration heterogener Anwendungen auf
unterschiedlichen Plattformen auftreten.
 Definition einer grafischen Notation
Titel: Enterprise Integration Patterns
Autor: Gregor Hohpe, Bobby Woolf
Verlag: Addison-Wesley
ISBN: 0321200683
© OPITZ CONSULTING GmbH 2010 Seite 5Integration mit Apache Camel
Enterprise Integration Patterns (2)
 Musterkatalog besteht aus 65 Integration Patterns
 Die Muster lassen sich in verschiedenen Kategorien
unterteilen
 Message Construction
 Message Endpoints
 Message Channels
 Message Routing
 Message Transformation
 System Management
© OPITZ CONSULTING GmbH 2010 Seite 6Integration mit Apache Camel
2 Einführung in Apache Camel
© OPITZ CONSULTING GmbH 2010 Seite 7Integration mit Apache Camel
Enterprise Integration mit Apache Camel
 Open Source Integrations Framework
 Subprojekt von ApacheMQ
 Umsetzung eines Großteils der Enterprise Integration
Patterns
 Ermöglicht die Definition von Routing- und
Konvertierungsregeln in Java oder Scala auf Basis
 einer domänenpezifischen Sprache (DSL) bzw.
 Spring basierter XML-Konfiguration
Titel: Camel In Action
Autor: Claus Ibsen, Jonathan Anstey
Verlag: Manning
ISBN: 9781935182368
© OPITZ CONSULTING GmbH 2010 Seite 8Integration mit Apache Camel
Apache Camel (Architektur)
 Zentraler Punkt der Camel-Architektur: CamelContext
 Hier registrieren sich sämtliche Komponenten und erhalten
eine eindeutige Adresse in Form einer URI
Aus: Ibsen, Anstey: Camel in Action, Manning 2010
© OPITZ CONSULTING GmbH 2010 Seite 9Integration mit Apache Camel
Apache 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 Nachrichten
an eine JMS-Queue oder –Topic
 JDBC-Komponente: Verbindung mit Datenbanken via JDBC und Absetzen
von 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 Camel
Apache Camel (Endpunkte)
 Endpunkte arbeiten wahlweise als Consumer (in-only) oder
Producer (out)
 Consumer nehmen Nachrichten entgegen
 Producer erzeugen Nachrichten
 es ist aber auch möglich beide Rollen einzunehmen (in-out)
 Endpunkte werden durch protokollspezifische Factories
erzeugt und im Laufzeit-Container registriert
(CamelContext).
© OPITZ CONSULTING GmbH 2010 Seite 11Integration mit Apache Camel
Camel (Routenbildung)
 Routenbildung (Camel-Route) erfolgt über eine bestimmte
Anzahl von RouteBuildern, die dem CamelContext
hinzugefü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 das
Builder-Pattern zugrunde liegt
 Durch Verkettung von Methoden wird eine Route
(Nachrichtenfluss) definiert.
© OPITZ CONSULTING GmbH 2010 Seite 12Integration mit Apache Camel
3 Ein Beispiel
© OPITZ CONSULTING GmbH 2010 Seite 13Integration mit Apache Camel
Beispielmuster: Message-Filter
 spezielle Art eines Routers
 es werden nur Nachrichten weitergeleitet, deren Inhalt
bestimmte Kriterien erfüllt
 hat nur einen output-Channel
Nachricht
Typ A
Nachricht
Typ A
Nachricht
Typ ANachricht
Typ A
Nachricht
Typ B
Message
Fiilter
© OPITZ CONSULTING GmbH 2010 Seite 14Integration mit Apache Camel
Beispielmuster: Message Filter (Java)
 Java-Klassen müssen die Basisklasse
org.apache.camel.builder.RouteBuilder erweitern und die
Routenlogik in der configure-Methode bereitstellen
public 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 Camel
Beispielmuster: Message Filter (Java)
 Endpunkt A nimmt eine Nachricht aus einer Queue
entgegen (from). Diese wird anschließend verarbeitet und an
den 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 Camel
Beispielmuster: Message Filter
(Spring XML)
 Der CamelContext wird innerhalb des Beans-Tags in den
ApplicationContext eingtragen
 in der XML-Definition finden sich den Methoden der
Java-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 Camel
Ausführung in einer Java-Anwendung
 CamelContext kann programmatisch erzeugt werden
 Keine zusätzlichen Bibliotheken / Frameworks notwendig
CamelContext context = new DefaultCamelContext();
context.addRoutes(new MyRouteBuilder());
context.start();
© OPITZ CONSULTING GmbH 2010 Seite 18Integration mit Apache Camel
CamelContext in Spring
 Package-Tag: Package, in dem nach Route-Buildern gesucht
werden 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 Camel
4 Weitere Patterns
© OPITZ CONSULTING GmbH 2010 Seite 20Integration mit Apache Camel
Content Based Router
 Untersuchen des Inhaltes der Nachricht
 Weiterleitung in verschiedene Kanäle in Abhängigkeit von
ihrem Inhalt
 Kann auf verschiedenen Kriterien basieren (z.B.
Vorhandensein bestimmter Felder, Inhalt von Feldern…)
Neuer
Auftrag
Router
Endpunkt A
Endpunkt B
© OPITZ CONSULTING GmbH 2010 Seite 21Integration mit Apache Camel
Content Based Router
 Abarbeiten eines Auftrags aus der Queue
 Überprüfen der Nachricht (XML) anhand eines XPath-
Ausdrucks
RouteBuilder 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 Camel
Content 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 Camel
Splitter
 Empfängt eine Nachricht mit wiederkehrenden Elementen,
die separat verarbeitet werden können
 Für jedes Element (oder jede Teilmenge) der
Ursprungsnachricht wird eine neue Nachricht erzeugt
Neuer
Auftrag Splitter
Auftrags
position
1
Auftrags
position
2
Auftrags
position
3
© OPITZ CONSULTING GmbH 2010 Seite 24Integration mit Apache Camel
Splitter
 Laden von Aufträgen aus dem Dateisystem
 Nachricht (als String) wird zeilenweise zerlegt
 Entstehende Nachrichten werden an eine Queue gesandt
RouteBuilder 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 Camel
Splitter
 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 Camel
Message Translator
 Ermöglicht Kommunikation zwischen Systemen mit
verschiedenen Datenformaten
 Konvertiert eine Nachricht in das Format eines Partners
Eingehende
Nachricht
Umgeformte
NachrichtTranslator
© OPITZ CONSULTING GmbH 2010 Seite 27Integration mit Apache Camel
Message Translator
 Transformation einer XML-Nachricht mithilfe eines XSL-
Templates
 XSLT-Komponente erhält als Parameter den Pfad zum XSL-
Template
RouteBuilder 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 Camel
Message Translator
 Transformation kann alternativ durch (hier anonyme)
Implementierung eines Processors geschehen
 Durch Parameter exchange Zugriff auf eingehende (In) und
ausgehende (Out) Nachricht
 Beliebige Ausführung von Java-Code möglich
from("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 Camel
Message Translator
 Anhängen von ‚extra data!‘ im transform-tag
 Statt Simple kann eine Vielzahl weiterer Expression
Languages 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 Camel
5 Beans
© OPITZ CONSULTING GmbH 2010 Seite 31Integration mit Apache Camel
Message Translator: Bean
 Nutzung einer Java Bean, falls komplexe Logik für
Transformation benötigt (z.B. DB-Zugriff, Schleifen)
 Vorteil: Routenbeschreibung bleibt übersichtlich und
deklarativ, Logik wird ausgelagert
 Bean-Komponente erhält als Parameter den Namen der
Bean und den Methodennamen
 Ist kein Methodenname angegeben oder wurde die Methode überladen, wird
versucht, anhand der Nachricht die richtige Methode zu ermitteln
 Bean muss im Spring-Context oder im JNDI-Context
registriert werden
from("file://Auftraege").to(
"bean:ConverterBean?method=convertOrder").to(
"activemq:Auftraege");
© OPITZ CONSULTING GmbH 2010 Seite 32Integration mit Apache Camel
Die Bean
 Rückgabe der convertOrder-Methode wird an den Body der
Nachricht gebunden
 Mittels der @Header-Annotation wird der Header
‚headerName‘ an den Parameter header gebunden
 Mittels der @XPath-Annotation wird die Nachricht mit einem
XPath-Ausdruck ausgewertet und das Ergebnis an den
Parameter auftragsNummer gebunden
public 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 Camel
Typ-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
@Converter
public class IOConverter {
@Converter
public static InputStream toInputStream(File file)
throws FileNotFoundException {
return new BufferedInputStream(new
FileInputStream(file));
}
}
© OPITZ CONSULTING GmbH 2010 Seite 34Integration mit Apache Camel
Beans an Endpunkte binden
 Eine einfache Alternative zur Definition einer kompletten
Route
 Durch die @Consume-Annotation wird die Methode an den
als Parameter übergebenen Endpunkt gebunden
 Beim Eintreffen einer neuen Nachricht wird die Methode mit
der Nachricht als Parameter aufgerufen
public class AuftragsBean {
@Consume(uri = "activemq:Auftraege")
public void pruefeAuftrag(String body) {
...
}
}
© OPITZ CONSULTING GmbH 2010 Seite 35Integration mit Apache Camel
Nachrichten an Endpunkte senden
 Durch die @Produce-Annotation wird der Bean ein
Producer-Template injiziert, mit dessen Hilfe Nachrichten an
den jeweiligen Endpunkt gesendet werden können
 Weitere Methoden verfügbar (z.B. senden von Headern)
 (Nachteil: Aufrufer wird vom Camel-API abhängig; kann
durch 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 Camel
Testen
 Spezielle Komponente: Mock-Endpoints
 Abstrakte Klasse CamelTestSupport
 Formulieren von Erwartungen und Assertions für Mock-
Endpunkte
 Zugriff auf Nachrichten, die an Mock-Endpunkten
eingegangen sind
© OPITZ CONSULTING GmbH 2010 Seite 37Integration mit Apache Camel
Testen: Testklasse
public class FilterTest extends CamelTestSupport {
@EndpointInject(uri = "mock:result")
protected MockEndpoint resultEndpoint;
@Produce(uri = "direct:start")
protected ProducerTemplate template;
@Override
protected 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 Camel
Testen: Testmethoden
public 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 Camel
Quellen 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 Camel
Fragen und Antworten

Más contenido relacionado

La actualidad más candente

Java Server Faces (JSF)
Java Server Faces (JSF)Java Server Faces (JSF)
Java Server Faces (JSF)Heithem Abbes
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Comparaison de outils mda
Comparaison de outils mdaComparaison de outils mda
Comparaison de outils mdaShili Mohamed
 
Enterprise messaging with jms
Enterprise messaging with jmsEnterprise messaging with jms
Enterprise messaging with jmsSridhar Reddy
 
JEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdfJEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdfMahmoudiOussama
 
API : l'architecture REST
API : l'architecture RESTAPI : l'architecture REST
API : l'architecture RESTFadel Chafai
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Eric Bourdet
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation MavenSOAT
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataLhouceine OUHAMZA
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API RESTAbdoulaye Dieng
 

La actualidad más candente (20)

Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
cours-gratuit.com--id-4422.pdf
cours-gratuit.com--id-4422.pdfcours-gratuit.com--id-4422.pdf
cours-gratuit.com--id-4422.pdf
 
Java Server Faces (JSF)
Java Server Faces (JSF)Java Server Faces (JSF)
Java Server Faces (JSF)
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Le langage html
Le langage htmlLe langage html
Le langage html
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Comparaison de outils mda
Comparaison de outils mdaComparaison de outils mda
Comparaison de outils mda
 
Enterprise messaging with jms
Enterprise messaging with jmsEnterprise messaging with jms
Enterprise messaging with jms
 
JEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdfJEE_Chapter4_JSF_VF (1).pdf
JEE_Chapter4_JSF_VF (1).pdf
 
Honeypot
HoneypotHoneypot
Honeypot
 
API : l'architecture REST
API : l'architecture RESTAPI : l'architecture REST
API : l'architecture REST
 
Java Server Faces 2
Java Server Faces 2Java Server Faces 2
Java Server Faces 2
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 

Similar a Integration camel

06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP
06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP
06 Software Development Guidelines der COMLINE Cloud Service Platform - CSPChristian Guenther
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsAndreas Schulte
 
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?Michael Hofmann
 
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...OPITZ CONSULTING Deutschland
 
Ajax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestAjax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestBastian Feder
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzeRalf Lütke
 
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkTYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkdie.agilen GmbH
 
HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009Felix Sasaki
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenChristian Münch
 
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"Aberla
 
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...Karionis
 
OpenStack – Automatisiertes Bereitstellen von Instanzen
OpenStack – Automatisiertes Bereitstellen von InstanzenOpenStack – Automatisiertes Bereitstellen von Instanzen
OpenStack – Automatisiertes Bereitstellen von InstanzenB1 Systems GmbH
 
elemente websolutions - Zusammenfassung T3DD09
elemente websolutions - Zusammenfassung T3DD09elemente websolutions - Zusammenfassung T3DD09
elemente websolutions - Zusammenfassung T3DD09elemente websolutions
 
MT AG: Sesam oeffne Dich
MT AG: Sesam oeffne DichMT AG: Sesam oeffne Dich
MT AG: Sesam oeffne DichMT AG
 
Frontend-Architektur der 1&1 Bestellsysteme
Frontend-Architektur der 1&1 BestellsystemeFrontend-Architektur der 1&1 Bestellsysteme
Frontend-Architektur der 1&1 BestellsystemeNico Steiner
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJohannes Hohenbichler
 
Scala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceScala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceOliver Braun
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 
Die Open eHealth Integration Platform
Die Open eHealth Integration PlatformDie Open eHealth Integration Platform
Die Open eHealth Integration Platformkrasserm
 

Similar a Integration camel (20)

06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP
06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP
06 Software Development Guidelines der COMLINE Cloud Service Platform - CSP
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite Applications
 
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
Service Mesh mit Istio und MicroProfile - eine harmonische Kombination?
 
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...
Oracle BAM - Volle Übersicht über Meta- und Prozessdaten - DOAG Konferenz 201...
 
Ajax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google SuggestAjax hands on - Refactoring Google Suggest
Ajax hands on - Refactoring Google Suggest
 
PHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-AnsätzePHP-Module in statischen Seiten - Architektur-Ansätze
PHP-Module in statischen Seiten - Architektur-Ansätze
 
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkTYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
 
HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009
 
Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisieren
 
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
 
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
HTML5 im Überblick - semantisches HTML, Geolocation, Offline-Webanwendungen, ...
 
OpenStack – Automatisiertes Bereitstellen von Instanzen
OpenStack – Automatisiertes Bereitstellen von InstanzenOpenStack – Automatisiertes Bereitstellen von Instanzen
OpenStack – Automatisiertes Bereitstellen von Instanzen
 
elemente websolutions - Zusammenfassung T3DD09
elemente websolutions - Zusammenfassung T3DD09elemente websolutions - Zusammenfassung T3DD09
elemente websolutions - Zusammenfassung T3DD09
 
MT AG: Sesam oeffne Dich
MT AG: Sesam oeffne DichMT AG: Sesam oeffne Dich
MT AG: Sesam oeffne Dich
 
Frontend-Architektur der 1&1 Bestellsysteme
Frontend-Architektur der 1&1 BestellsystemeFrontend-Architektur der 1&1 Bestellsysteme
Frontend-Architektur der 1&1 Bestellsysteme
 
Java Magazin - Lift
Java Magazin - LiftJava Magazin - Lift
Java Magazin - Lift
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
 
Scala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceScala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) Space
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 
Die Open eHealth Integration Platform
Die Open eHealth Integration PlatformDie Open eHealth Integration Platform
Die Open eHealth Integration Platform
 

Integration camel

  • 1. © OPITZ CONSULTING GmbH 2010 Seite 1Integration mit Apache Camel Dr. Ralf Sigmund, Bereichsleiter OPITZ CONSULTING Hamburg GmbH Hamburg, 02.03.2011 Integration mit Apache Camel
  • 2. © OPITZ CONSULTING GmbH 2010 Seite 2Integration mit Apache Camel Agenda 1. Enterprise Integration Patterns 2. Einführung in Apache Camel 3. Ein Beispiel 4. Weitere Patterns 5. Beans
  • 3. © OPITZ CONSULTING GmbH 2010 Seite 3Integration mit Apache Camel 1 Enterprise Integration Patterns
  • 4. © OPITZ CONSULTING GmbH 2010 Seite 4Integration mit Apache Camel Enterprise Integration Patterns (EIP) (1)  Bewährte Lösungsschablonen für Integrationsszenarien auf Basis asynchronen Nachrichtenaustauschs  Muster beschreiben Lösung von Problemen, die bei der Integration heterogener Anwendungen auf unterschiedlichen Plattformen auftreten.  Definition einer grafischen Notation Titel: Enterprise Integration Patterns Autor: Gregor Hohpe, Bobby Woolf Verlag: Addison-Wesley ISBN: 0321200683
  • 5. © OPITZ CONSULTING GmbH 2010 Seite 5Integration mit Apache Camel Enterprise Integration Patterns (2)  Musterkatalog besteht aus 65 Integration Patterns  Die Muster lassen sich in verschiedenen Kategorien unterteilen  Message Construction  Message Endpoints  Message Channels  Message Routing  Message Transformation  System Management
  • 6. © OPITZ CONSULTING GmbH 2010 Seite 6Integration mit Apache Camel 2 Einführung in Apache Camel
  • 7. © OPITZ CONSULTING GmbH 2010 Seite 7Integration mit Apache Camel Enterprise Integration mit Apache Camel  Open Source Integrations Framework  Subprojekt von ApacheMQ  Umsetzung eines Großteils der Enterprise Integration Patterns  Ermöglicht die Definition von Routing- und Konvertierungsregeln in Java oder Scala auf Basis  einer domänenpezifischen Sprache (DSL) bzw.  Spring basierter XML-Konfiguration Titel: Camel In Action Autor: Claus Ibsen, Jonathan Anstey Verlag: Manning ISBN: 9781935182368
  • 8. © OPITZ CONSULTING GmbH 2010 Seite 8Integration mit Apache Camel Apache Camel (Architektur)  Zentraler Punkt der Camel-Architektur: CamelContext  Hier registrieren sich sämtliche Komponenten und erhalten eine eindeutige Adresse in Form einer URI Aus: Ibsen, Anstey: Camel in Action, Manning 2010
  • 9. © OPITZ CONSULTING GmbH 2010 Seite 9Integration mit Apache Camel Apache 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 Nachrichten an eine JMS-Queue oder –Topic  JDBC-Komponente: Verbindung mit Datenbanken via JDBC und Absetzen von 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. © OPITZ CONSULTING GmbH 2010 Seite 10Integration mit Apache Camel Apache Camel (Endpunkte)  Endpunkte arbeiten wahlweise als Consumer (in-only) oder Producer (out)  Consumer nehmen Nachrichten entgegen  Producer erzeugen Nachrichten  es ist aber auch möglich beide Rollen einzunehmen (in-out)  Endpunkte werden durch protokollspezifische Factories erzeugt und im Laufzeit-Container registriert (CamelContext).
  • 11. © OPITZ CONSULTING GmbH 2010 Seite 11Integration mit Apache Camel Camel (Routenbildung)  Routenbildung (Camel-Route) erfolgt über eine bestimmte Anzahl von RouteBuildern, die dem CamelContext hinzugefü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 das Builder-Pattern zugrunde liegt  Durch Verkettung von Methoden wird eine Route (Nachrichtenfluss) definiert.
  • 12. © OPITZ CONSULTING GmbH 2010 Seite 12Integration mit Apache Camel 3 Ein Beispiel
  • 13. © OPITZ CONSULTING GmbH 2010 Seite 13Integration mit Apache Camel Beispielmuster: Message-Filter  spezielle Art eines Routers  es werden nur Nachrichten weitergeleitet, deren Inhalt bestimmte Kriterien erfüllt  hat nur einen output-Channel Nachricht Typ A Nachricht Typ A Nachricht Typ ANachricht Typ A Nachricht Typ B Message Fiilter
  • 14. © OPITZ CONSULTING GmbH 2010 Seite 14Integration mit Apache Camel Beispielmuster: Message Filter (Java)  Java-Klassen müssen die Basisklasse org.apache.camel.builder.RouteBuilder erweitern und die Routenlogik in der configure-Methode bereitstellen public class MyRouteBuilder extends RouteBuilder { public void configure() throws Exception { from("activemq:topic:Quotes").filter(). xpath("/quote/product='widget'") .to("mqseries:WidgeQuotes"); } }
  • 15. © OPITZ CONSULTING GmbH 2010 Seite 15Integration mit Apache Camel Beispielmuster: Message Filter (Java)  Endpunkt A nimmt eine Nachricht aus einer Queue entgegen (from). Diese wird anschließend verarbeitet und an den 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. © OPITZ CONSULTING GmbH 2010 Seite 16Integration mit Apache Camel Beispielmuster: Message Filter (Spring XML)  Der CamelContext wird innerhalb des Beans-Tags in den ApplicationContext eingtragen  in der XML-Definition finden sich den Methoden der Java-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. © OPITZ CONSULTING GmbH 2010 Seite 17Integration mit Apache Camel Ausführung in einer Java-Anwendung  CamelContext kann programmatisch erzeugt werden  Keine zusätzlichen Bibliotheken / Frameworks notwendig CamelContext context = new DefaultCamelContext(); context.addRoutes(new MyRouteBuilder()); context.start();
  • 18. © OPITZ CONSULTING GmbH 2010 Seite 18Integration mit Apache Camel CamelContext in Spring  Package-Tag: Package, in dem nach Route-Buildern gesucht werden 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. © OPITZ CONSULTING GmbH 2010 Seite 19Integration mit Apache Camel 4 Weitere Patterns
  • 20. © OPITZ CONSULTING GmbH 2010 Seite 20Integration mit Apache Camel Content Based Router  Untersuchen des Inhaltes der Nachricht  Weiterleitung in verschiedene Kanäle in Abhängigkeit von ihrem Inhalt  Kann auf verschiedenen Kriterien basieren (z.B. Vorhandensein bestimmter Felder, Inhalt von Feldern…) Neuer Auftrag Router Endpunkt A Endpunkt B
  • 21. © OPITZ CONSULTING GmbH 2010 Seite 21Integration mit Apache Camel Content Based Router  Abarbeiten eines Auftrags aus der Queue  Überprüfen der Nachricht (XML) anhand eines XPath- Ausdrucks RouteBuilder 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. © OPITZ CONSULTING GmbH 2010 Seite 22Integration mit Apache Camel Content 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. © OPITZ CONSULTING GmbH 2010 Seite 23Integration mit Apache Camel Splitter  Empfängt eine Nachricht mit wiederkehrenden Elementen, die separat verarbeitet werden können  Für jedes Element (oder jede Teilmenge) der Ursprungsnachricht wird eine neue Nachricht erzeugt Neuer Auftrag Splitter Auftrags position 1 Auftrags position 2 Auftrags position 3
  • 24. © OPITZ CONSULTING GmbH 2010 Seite 24Integration mit Apache Camel Splitter  Laden von Aufträgen aus dem Dateisystem  Nachricht (als String) wird zeilenweise zerlegt  Entstehende Nachrichten werden an eine Queue gesandt RouteBuilder builder = new RouteBuilder() { public void configure() { from("file://Auftraege"). split(body(String.class).tokenize("n")). to("activemq:Auftraege.Positionen"); } };
  • 25. © OPITZ CONSULTING GmbH 2010 Seite 25Integration mit Apache Camel Splitter  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. © OPITZ CONSULTING GmbH 2010 Seite 26Integration mit Apache Camel Message Translator  Ermöglicht Kommunikation zwischen Systemen mit verschiedenen Datenformaten  Konvertiert eine Nachricht in das Format eines Partners Eingehende Nachricht Umgeformte NachrichtTranslator
  • 27. © OPITZ CONSULTING GmbH 2010 Seite 27Integration mit Apache Camel Message Translator  Transformation einer XML-Nachricht mithilfe eines XSL- Templates  XSLT-Komponente erhält als Parameter den Pfad zum XSL- Template RouteBuilder builder = new RouteBuilder() { public void configure() { from("file://Auftraege").to( "xslt:com/acme/mytransform.xsl").to( "activemq:Auftraege"); } };
  • 28. © OPITZ CONSULTING GmbH 2010 Seite 28Integration mit Apache Camel Message Translator  Transformation kann alternativ durch (hier anonyme) Implementierung eines Processors geschehen  Durch Parameter exchange Zugriff auf eingehende (In) und ausgehende (Out) Nachricht  Beliebige Ausführung von Java-Code möglich from("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. © OPITZ CONSULTING GmbH 2010 Seite 29Integration mit Apache Camel Message Translator  Anhängen von ‚extra data!‘ im transform-tag  Statt Simple kann eine Vielzahl weiterer Expression Languages 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. © OPITZ CONSULTING GmbH 2010 Seite 30Integration mit Apache Camel 5 Beans
  • 31. © OPITZ CONSULTING GmbH 2010 Seite 31Integration mit Apache Camel Message Translator: Bean  Nutzung einer Java Bean, falls komplexe Logik für Transformation benötigt (z.B. DB-Zugriff, Schleifen)  Vorteil: Routenbeschreibung bleibt übersichtlich und deklarativ, Logik wird ausgelagert  Bean-Komponente erhält als Parameter den Namen der Bean und den Methodennamen  Ist kein Methodenname angegeben oder wurde die Methode überladen, wird versucht, anhand der Nachricht die richtige Methode zu ermitteln  Bean muss im Spring-Context oder im JNDI-Context registriert werden from("file://Auftraege").to( "bean:ConverterBean?method=convertOrder").to( "activemq:Auftraege");
  • 32. © OPITZ CONSULTING GmbH 2010 Seite 32Integration mit Apache Camel Die Bean  Rückgabe der convertOrder-Methode wird an den Body der Nachricht gebunden  Mittels der @Header-Annotation wird der Header ‚headerName‘ an den Parameter header gebunden  Mittels der @XPath-Annotation wird die Nachricht mit einem XPath-Ausdruck ausgewertet und das Ergebnis an den Parameter auftragsNummer gebunden public class ConverterBean { @Consume(uri = "activemq:Auftraege") public String convertOrder(@Header(value = "headerName") String header, @XPath(value = "/auftrag/nummer") String auftragsNummer) { return header + auftragsNummer; } }
  • 33. © OPITZ CONSULTING GmbH 2010 Seite 33Integration mit Apache Camel Typ-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 @Converter public class IOConverter { @Converter public static InputStream toInputStream(File file) throws FileNotFoundException { return new BufferedInputStream(new FileInputStream(file)); } }
  • 34. © OPITZ CONSULTING GmbH 2010 Seite 34Integration mit Apache Camel Beans an Endpunkte binden  Eine einfache Alternative zur Definition einer kompletten Route  Durch die @Consume-Annotation wird die Methode an den als Parameter übergebenen Endpunkt gebunden  Beim Eintreffen einer neuen Nachricht wird die Methode mit der Nachricht als Parameter aufgerufen public class AuftragsBean { @Consume(uri = "activemq:Auftraege") public void pruefeAuftrag(String body) { ... } }
  • 35. © OPITZ CONSULTING GmbH 2010 Seite 35Integration mit Apache Camel Nachrichten an Endpunkte senden  Durch die @Produce-Annotation wird der Bean ein Producer-Template injiziert, mit dessen Hilfe Nachrichten an den jeweiligen Endpunkt gesendet werden können  Weitere Methoden verfügbar (z.B. senden von Headern)  (Nachteil: Aufrufer wird vom Camel-API abhängig; kann durch ein Interface versteckt werden) public class SenderBean { @Produce(uri = "activemq:Auftraege") ProducerTemplate template; public void sendeNachricht() { template.sendBody("Nachricht"); } }
  • 36. © OPITZ CONSULTING GmbH 2010 Seite 36Integration mit Apache Camel Testen  Spezielle Komponente: Mock-Endpoints  Abstrakte Klasse CamelTestSupport  Formulieren von Erwartungen und Assertions für Mock- Endpunkte  Zugriff auf Nachrichten, die an Mock-Endpunkten eingegangen sind
  • 37. © OPITZ CONSULTING GmbH 2010 Seite 37Integration mit Apache Camel Testen: Testklasse public class FilterTest extends CamelTestSupport { @EndpointInject(uri = "mock:result") protected MockEndpoint resultEndpoint; @Produce(uri = "direct:start") protected ProducerTemplate template; @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { from("direct:start").filter( header("auftragsNummer").isEqualTo("1")).to( "mock:result"); } }; } }
  • 38. © OPITZ CONSULTING GmbH 2010 Seite 38Integration mit Apache Camel Testen: Testmethoden public 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. © OPITZ CONSULTING GmbH 2010 Seite 39Integration mit Apache Camel Quellen und weiterführende Links  http://camel.apache.org/enterprise-integration-patterns.html  http://www.enterpriseintegrationpatterns.com/  http://camel.apache.org/components.html
  • 40. © OPITZ CONSULTING GmbH 2010 Seite 40Integration mit Apache Camel Fragen und Antworten