#LyX 1.6.4 created this file. For more info see http://www.lyx.org/ \lyxformat 345 \begin_document \begin_header \textclass scrreprt \begin_preamble \usepackage{preamble} \end_preamble \options oneside,openright,titlepage,fleqn,pointlessnumbers,headinclude,10pt,a4paper,BCOR5mm,footinclude,cleardoubleempty \use_default_options true \language ngerman \inputencoding auto \font_roman default \font_sans default \font_typewriter default \font_default_family default \font_sc false \font_osf false \font_sf_scale 100 \font_tt_scale 100 \graphics default \paperfontsize 10 \spacing single \use_hyperref false \papersize a4paper \use_geometry false \use_amsmath 1 \use_esint 0 \cite_engine natbib_numerical \use_bibtopic false \paperorientation portrait \leftmargin 1cm \topmargin 1cm \rightmargin 2cm \bottommargin 1cm \headheight 1cm \headsep 1cm \footskip 1cm \secnumdepth 2 \tocdepth 2 \paragraph_separation indent \defskip medskip \quotes_language polish \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \author "" \author "" \end_header \begin_body \begin_layout Chapter Prototypische Implementierung \end_layout \begin_layout Standard Anhand des hier beschriebenen fiktiven Geschäftsprozesses veranschaulichen die nachfolgenden Abschnitte verschiedene Implementierungen von Funktions- und Datenintegration, deren Konzepte in Form von EIPs dargestellt sind, mittels Apache Camel. \end_layout \begin_layout Section Beschreibung des Integrationsszenarios \end_layout \begin_layout Standard \begin_inset CommandInset label LatexCommand label name "sec:Beschreibung-des-Szenarios" \end_inset \end_layout \begin_layout Standard In diesem Abschnitt soll ein fiktives Szenario zur Integration mehrerer Anwendung auf Funktions- und Datenebene beschrieben werden. \end_layout \begin_layout Subsection Der Beispielgeschäftsprozeß \end_layout \begin_layout Standard \begin_inset CommandInset label LatexCommand label name "sub:Der-Beispielgeschäftsprozeß" \end_inset \end_layout \begin_layout Standard Dem Integrationskonzept und der prototypischen Implementierung liegt ein einfacher fiktiver Geschäftsprozeß zugrunde, der einen Bestellvorgang beschreib t. \end_layout \begin_layout Standard Die Bestellungen durch Kunden erreichen das System auf zwei Wegen. Erstens sollen Dateien im CSV-Format in einem bestimmten Verzeichnis beispielsw eise per ftp abgelegt werden. Dabei folgen die Dateinamen der Konvention .csv. Jede Zeile in der CSV-Datei stellt eine Bestellposition im Format ,, dar. Das Verzeichnis soll regelmäßig auf neue Dateien überprüft werden. Neue Dateien sollen automatisch verarbeitet werden. \end_layout \begin_layout Standard Desweiteren soll eine Webservice-Schnittstelle bereit gestellt werden, über die Kunden Bestellungen senden können. Bei Bestellungen auf diesem Weg soll dem Kunde die Bestellnummer der neuen Bestellung zurückgegeben werden. \end_layout \begin_layout Standard Diese Bestellnummer wird von einem auf Funktionsebene zu integrierenden Legacy-System erzeugt. \end_layout \begin_layout Standard Nach Verarbeitung einer Bestellung durch das Legacy-System soll eine E-Mail zur Benachrichtigung mit den Bestelldaten an eine bestimmte Adresse versendet werden. Jede verschickte E-Mail soll in einem bestimmten Verzeichnis als Sicherungsdate i aufbewahrt werden. \end_layout \begin_layout Subsection Darstellung als EIP Diagramm \end_layout \begin_layout Standard Die Abbildung \begin_inset CommandInset ref LatexCommand ref reference "Abb:intergationsdiagramm" \end_inset zeigt das Integrationsszenario zur Realisierung des Prototyps unter Verwendung der EIP-Symbolik. Die nachfolgende Beschreibung der Implementierung orientiert sich an diesem Diagramm, ebenso wie die Implementirung selbst. Zwar existiert kein Verfahren zur direkten Ableitung einer Camel-Implementierun g aus einem EIP-Diagramm, allerdings lassen sich Teile der Implementierung anhand eines Diagramms manuell identifizieren. Ebenso erhält der Integrator einen \begin_inset Quotes pld \end_inset roten Faden \begin_inset Quotes prd \end_inset zur Implementierung der Routing- und Mediationsregeln. \end_layout \begin_layout Standard \begin_inset Float figure placement h wide false sideways false status open \begin_layout Plain Layout \align center \begin_inset Graphics filename gfx/eip_diag_detail.png width 120text% \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Integrationsszenario \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "Abb:intergationsdiagramm" \end_inset \end_layout \end_inset \end_layout \begin_layout Section Apache Camel Implementierung \end_layout \begin_layout Subsection Konzept der Implementierung \end_layout \begin_layout Standard Wie bereits in Abschnitt \begin_inset CommandInset ref LatexCommand ref reference "sec:CamelDSLXML" \end_inset angemerkt, bestehen zwei Möglichkeiten, wie sich Integrationslösungs mit Apache Camel implementieren lassen. Die hier vorgestellte Implementierung verwendet größtenteils die JavaDSL, da die Verwendung der XML-Konfiguration eine Betrachtung des Spring 2 Framework s, die den Rahmen dieser Arbeit überschreiten würde, erfordern würde. Durch Verwendung der JavaDSL ist es möglich eine Integrationslösung in einer Entwicklungsumgebung wie z. B. Eclipse zu schreiben bzw. zu programmieren. Dabei stehen dem Integrator alle Hilfsmittel der Entwicklungsumgebung wie z. B. Auto-Vervollständigung zur Verfügung. Eine Datenintegration erfolgt innerhalb dieses Prototyps an allen Stellen, an denen das Format von Daten verändert wird. So z. B. innerhalb der Transformer im OrderNormalizer \begin_inset CommandInset ref LatexCommand ref reference "sub:OrderNormalizer" \end_inset . Der Prototyp verzichtet dabei bewußt auf jede Form der Ausnahme- und Fehlerbeha ndlung zugunsten der Einfachheit und Übersichtlichkeit. \end_layout \begin_layout Subsection Einbindung der Webservice-Schnittstelle \end_layout \begin_layout Standard Apache Camel bietet mittels entsprechender Plugins die Möglichkeit, eine Webservice-Schnittstelle direkt als Endpunkt zu definieren. \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/resources/OrderService.wsdl" lstparams "caption={OrderService.wsdl},columns=2,frame=shadowbox,label={lst:OrderService.wsdl},language=XML,tabsize=2" \end_inset Dazu verwendet der Prototyp den Servletcontainer Jetty \begin_inset CommandInset citation LatexCommand citep key "jetty" \end_inset und Apache CXF \begin_inset CommandInset citation LatexCommand citep key "cxf" \end_inset als Webservice-Framework. Beide Komponenten stehen als Apache Camel Plugins zur Verfügung. Dieser Ansatz erlaubt es, die Webservice-Schnittstelle nach deren Definition in einer WSDL-Datei \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderService.wsdl" \end_inset ohne implementierende Java-Klasse bereitzustellen. Dazu sind die Konfigurationsdateien pom.xml \begin_inset CommandInset ref LatexCommand ref reference "lst:pom.xml" \end_inset , camel-config.xml \begin_inset CommandInset ref LatexCommand ref reference "lst:camel-context.xml" \end_inset und web.xml \begin_inset CommandInset ref LatexCommand ref reference "lst:web.xml" \end_inset entsprechend anzupassen. \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/pom.xml" lstparams "caption={pom.xml},frame=shadowbox,label={lst:pom.xml},language=XML,tabsize=2" \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/resources/META-INF/spring/camel-context.xml" lstparams "caption={camel-context.xml},frame=shadowbox,label={lst:camel-context.xml},language=XML,tabsize=2" \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/webapp/WEB-INF/web.xml" lstparams "caption={web.xml},frame=shadowbox,label={lst:web.xml},language=XML,tabsize=2" \end_inset \end_layout \begin_layout Standard Die Generierung der Java-Klassen aus der WSDL-Datei \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderService.wsdl" \end_inset erfolgt innerhalb des Maven Build-Vorgangs. Das Starten von Jetty erfolgt im Zuge des Starts von Camel durch Maven. In der Spring-Konfigurationsdatei \begin_inset CommandInset ref LatexCommand ref reference "lst:camel-context.xml" \end_inset werden zwei Beans definiert, die die Einbindung des Bestellsystems realisieren. Das Spring-Framework übernimmt dabei die Verwaltung der Lebenszyklen der Bean-Objekte. \end_layout \begin_layout Subsection Zentrale Route \end_layout \begin_layout Standard Den zentralen Verarbeitungsablauf der Integrationslösung realisiert die Java-Klasse \shape italic OrderRoutes \shape default . Sie erbt wie zuvor beschrieben von der Camel-Klasse \shape italic RouteBuilder \shape default und überschreibt die Methode \shape italic configure \shape default . Diese Methode enthält eine Abfolge von Routing- und Mediationsregeln entspreche nd der Anforderungen. \end_layout \begin_layout Standard Im ersten Schritt erfolgt die Definition der Endpunkte für den Webservice \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderService.wsdl" \end_inset und das Verzeichnis für die CSV-Dateien. Sobald eine Bestellung an einem dieser beiden Endpunkt eintrifft, wird sie in eine entsprechende Nachricht umgewandelt und im Kopf der Nachricht der Ursprung der Bestellung ( \shape italic cxf \shape default bwz. \shape italic csvinput \shape default ) vermerkt. Danach erfolgt die Weiterleitung in den Kanal \shape italic new-orders-in \shape default . Die Nachrichten in diesem Kanal werden vom OrderNormalizer \begin_inset CommandInset ref LatexCommand ref reference "sub:OrderNormalizer" \end_inset konsumiert. Dieser stellt die Nachrichten in einem einheitlichen Datenformat im Kanal \shape italic normalized-orders \shape default bereit. Kanäle mit einheitlichen Nachrichten stellen das EIP \shape italic Datatype Channel \shape default dar. \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/java/de/h_da/fbi/dsi/ws0910/camelprototype/OrderRoutes.java" lstparams "caption={OrderRoutes.java},frame=shadowbox,label={lst:OrderRoutes.java},language=Java,tabsize=2" \end_inset \end_layout \begin_layout Subsection OrderNormalizer \end_layout \begin_layout Standard \begin_inset CommandInset label LatexCommand label name "sub:OrderNormalizer" \end_inset \end_layout \begin_layout Standard Die Implementierung des EIP \shape italic Normalizer \shape default zur Realisierung des OrderNormalizers erfolgt in einer separaten Java-Klasse, die ebenfalls von \shape italic RouteBuilder \shape default erbt. Dadurch bleiben die Routen übersichtlich und lassen sich ggf. leichter wiederverwenden. Ebenso folgt die Auslagerung des OrderNormalizers in eigene Klasse dem in Diagramm \begin_inset CommandInset ref LatexCommand ref reference "Abb:intergationsdiagramm" \end_inset dargestellten Implementierungskonzept. \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/java/de/h_da/fbi/dsi/ws0910/camelprototype/OrderNormalizer.java" lstparams "caption={OrderNormalizer.java},frame=shadowbox,label={lst:OrderNormalizer.java},language=Java,tabsize=2" \end_inset \end_layout \begin_layout Standard Der OrderNormalizer konsumiert die Nachrichten in unterschiedlichen Formaten aus dem Kanal \shape italic new-orders-in \shape default . Mithilfe eines Content Based Router, der das zuvor eingefügte Kopfzeilenfeld \shape italic from \shape default auswertet. Im Falle von \shape italic cxf \shape default erfolgt die Konvertierung ohne weiteren Aufwand durch Verwendung der methode \shape italic convertTo \shape default . \end_layout \begin_layout Standard Lautet das \shape italic from \shape default -Feld \shape italic csvinput \shape default , so wird die Nutzlast der Nachricht nach Konvertierung in das Camel-CSV-Format an die Methode \shape italic transformFromCsv \shape default einer Bean-Instanz der Klasse \shape italic OrderTransformer \shape default übergeben. Dort stehen die Daten als zweidimensionale Liste zur Verfügung. Aus diesen Daten wird ein Objekt vom Typ \shape italic InputNewOrder \shape default generiert und als Nutzlast der Nachricht gesetzt. \end_layout \begin_layout Subsection Normalized-Orders \end_layout \begin_layout Standard Der Kanal \shape italic normalized-orders \shape default enthält somit ausschließlich Nachrichten, deren Nutzlast im Format \shape italic InputNewOrder \shape default vorliegt. Der Einfachheit halber benutzt der Prototyp dieses Format als normalisiertes Datenformat. Alle nachfolgenden Verarbeitungsschritte, die diesen Kanal verwenden, finden die Nutzlast der Nachrichten in einem festen Format vor. \end_layout \begin_layout Subsection Funktionsintegration des Legacy-Systems \end_layout \begin_layout Standard Der hier gezeigte Prototyp repräsentiert ein fiktives Legacy-System, das den Bestellprozeß abwickelt, als einfache Java-Klasse \shape italic OrderSystem \shape default , die keinerlei Bestandteile von Camel verwendet und somit sehr lose gekoppelt ist. Die Integration erfolgt mithilfe der Java-Klasse \shape italic OrderSystemAdaptor \shape default \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderSystemAdaptor.java" \end_inset , die einen Adapter nach dem EIP \shape italic Event-Driven Consumer \shape default zwischen Camel und dem Legacy-System darstellt. Der Einfachheit halber verwendet das Legacy-System hier direkt das normalisiert e Datenformat, es könnte aber im Adapter durch einen integrierten Transformer in ein beliebiges Format konvertiert werden. \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/java/de/h_da/fbi/dsi/ws0910/camelprototype/OrderSystemAdaptor.java" lstparams "caption={OrderSystemAdaptor.java},frame=shadowbox,label={lst:OrderSystemAdaptor.java},language=Java,tabsize=2" \end_inset \end_layout \begin_layout Standard Das EIP \shape italic Event-Driven Consumer \shape default läßt sich mit Camel durch Implementieren des Interfaces Processor realisieren. An dieser Stelle findet eine Integration eines Legacy-Systems auf Funktionseben e statt, indem der \shape italic OrderSystemAdaptor \shape default die Methode \shape italic handleNewOrder \shape default der \shape italic OrderSystem \shape default -Instanz mit dem \shape italic InputNewOrder \shape default Objekt als Parameter aufruft. Diese Methode liefert die generierte Bestellnummer als String zurück. \end_layout \begin_layout Standard Die Funktion des Bestellsystem beschränkt sich auf das Speichern der Bestellung in einer relationalen SQL-Datenbank mit dem Zeitstempel des Bestelleingangs und die Rückgabe der Bestellnummer. Diese speichert der \shape italic OrderSystemAdaptor \shape default \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderSystemAdaptor.java" \end_inset in der Kopfzeile \shape italic orderno \shape default der Nachricht. \end_layout \begin_layout Standard Der Aufruf des Bestellsystems erfolgt dabei über eine Bean-Referenz durch die Camel-Methode \shape italic processRef \shape default . Der Parameter dieser Methode ist ein String, der mit der id einer Bean aus der Spring-Konfigurationsdatei \begin_inset CommandInset ref LatexCommand ref reference "lst:camel-context.xml" \end_inset übereinstimmen muss. \end_layout \begin_layout Subsection Generierung und Speicherung der Benachrichtigungs-E-Mails \end_layout \begin_layout Standard Die vom Bestellsystem generierte Bestellnummer dient der eindeutigen Speicherung der Sicherungskopie der Benachrichtigungs-E-Mail nach dem Muster ordermail-.txt. Das Templating-System Velocity \begin_inset CommandInset citation LatexCommand citep key "velocityWebsite" \end_inset , das Camel als Endpunkt im Plugin \shape italic camel-velocity \shape default bereitstellt, befüllt die Vorlage \shape italic OrderMailBody.vm \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderMailBody.vm" \end_inset \shape default mit den Daten der jeweils zu verarbeitenden Bestellung. \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/main/resources/OrderMailBody.vm" lstparams "caption={OrderMailBody.vm},frame=shadowbox,label={lst:OrderMailBody.vm}" \end_inset \end_layout \begin_layout Standard Der nachgelagerte Routing-Eintrag speichert die E-Mail-Dateien im Verzeichnis \begin_inset Quotes pld \end_inset target/ordermails \begin_inset Quotes prd \end_inset mittels einer Dateiendpunkt-Komponente. Eine Polling-Consumer-Komponte überwacht dieses Verzeichnis und übergibt dort gefundene E-Mail-Dateien an eine SMTP-Komponente. Diese übernimmt das Versenden der E-Mail an die konfigurierte Zieladresse. Schließlich erfolgt das Speichern der E-Mail-Datei im Verzeichnis \begin_inset Quotes pld \end_inset target/ordermails/sent \begin_inset Quotes prd \end_inset . \end_layout \begin_layout Subsection Rückgabe der Bestellnummer an den Webservice-Konsumenten \end_layout \begin_layout Standard Ein zusätzlicher Content Based Router nach dem \shape italic OrderSystemAdaptor \shape default \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderSystemAdaptor.java" \end_inset leitet die Nachricht an einen weiteren Prozessor weiter, falls die Kopfzeile \shape italic from \shape default den Text \shape italic cxf \shape default enthält. Dieser ist als Inline-Prozessor implementiert und setzt als Nutzlast der Ausgangsnachricht des Nachrichtenaustauschs eine neue Objektinstanz der Klasse \shape italic OutputNewOrder \shape default mit entsprechendem Erfolgsstatus und der generierten Bestellnummer. Dieses Objekt stellt die Antwort der Webservice-Schnittstelle \begin_inset CommandInset ref LatexCommand ref reference "lst:OrderService.wsdl" \end_inset an den Webservice-Konsumenten dar. \end_layout \begin_layout Section Testfall \end_layout \begin_layout Standard Zum Testen des Prototypen dient ein JUnit-Test, der in der Java-Klasse CreateOrd erRoutesTest \begin_inset CommandInset ref LatexCommand ref reference "lst:CreateOrderRoutesTest.java" \end_inset implementiert ist. \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/test/java/de/h_da/fbi/dsi/ws0910/camelprototype/CreateOrderRoutesTest.java" lstparams "caption={CreateOrderRoutesTest.java},frame=shadowbox,label={lst:CreateOrderRoutesTest.java},language=Java,tabsize=2" \end_inset \end_layout \begin_layout Standard \begin_inset CommandInset include LatexCommand lstinputlisting filename "../CamelPrototype/src/test/resources/CreateOrderRoutesTest-context.xml" lstparams "caption={CreateOrderRoutesTest-context.xml},frame=shadowbox,label={lst:CreateOrderRoutesTest-context.xml},language=XML,tabsize=2" \end_inset \end_layout \begin_layout Standard Diese Test-Klasse enthält zwei Tests, sowie die Definition der Testumgebung. Die Testumgebung beinhaltet den in der Datei \begin_inset CommandInset ref LatexCommand ref reference "lst:CreateOrderRoutesTest-context.xml" \end_inset definierten Camel-Context und einen Mailbox-Mock, der die generierten E-Mails empfängt. Dabei wird die zentrale Route \shape italic OrderRoutes \shape default durch Konstruktor-Parameter so konfiguriert, dass sie anstatt an eine reale E-Mail-Adresse an den Mailbox-Mock sendet. Der erste Test generiert fünf Bestellungen und überträgt sie nacheinander über die Webservice-Schnittstelle. Nach jedem Senden überprüft sie die Test-Mailbox-Mock, ob sie jeweils eine Nachricht mehr als im vorherigen Testdurchlauf enthält und ob die Antwort des Webservice eine Bestellnummer enthält. \end_layout \begin_layout Standard Zum Test der CSV-Funktionalität generiert der Testfall eine CSV-Datei, legt sie im Zielverzeichnis ab und überprüft Mailbox-Mock auf eine neue Nachricht. Jede Testbestellung enthält drei Positionen. \end_layout \begin_layout Standard Die \shape italic tearDown \shape default Methode gibt den Inhalt der Bestelldatenbank zur Überprüfung auf der Konsole aus. \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \align center \begin_inset Graphics filename gfx/screenshot_orders.png width 120text% \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Inhalt der Tabelle \shape italic orders \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "Abb:orders-table" \end_inset \end_layout \begin_layout Plain Layout \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \align center \begin_inset Graphics filename gfx/screenshot_orderpos.png width 120text% \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Inhalt der Tabelle \shape italic orderpos \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "Abb:orderpos-table" \end_inset \end_layout \begin_layout Plain Layout \end_layout \end_inset Der Start des Testfalls erfolgt durch das Kommando \shape italic mvn test \shape default auf der Konsole im Wurzelverzeichnis des Projekts. \end_layout \begin_layout Standard Mithilfe eines geeigneten Datenbank-Betrachters wie z. B. Squirrel \begin_inset CommandInset citation LatexCommand citep key "Squirrel" \end_inset lassen sich die Einträge der Bestell-Datenbank ansehen. Die Abbildungen \begin_inset CommandInset ref LatexCommand ref reference "Abb:orders-table" \end_inset und \begin_inset CommandInset ref LatexCommand ref reference "Abb:orderpos-table" \end_inset zeigen die beiden Tabellen mit den Testdaten. \begin_inset Float figure wide false sideways false status open \begin_layout Plain Layout \align center \begin_inset Graphics filename gfx/screenshot_email.png width 80text% \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption \begin_layout Plain Layout Sicherungsdatei einer Bestellbenachrichtigung \end_layout \end_inset \begin_inset CommandInset label LatexCommand label name "Abb:orderemail" \end_inset \end_layout \begin_layout Plain Layout \end_layout \end_inset \end_layout \begin_layout Standard Die Abbildung \begin_inset CommandInset ref LatexCommand ref reference "Abb:orderemail" \end_inset zeigt den Inhalt einer vom System generierten Benachrichtigungs-E-Mail aus dem Ordner \begin_inset Quotes pld \end_inset target/ordermails/sent \begin_inset Quotes prd \end_inset . \end_layout \end_body \end_document