BPEL-Tutorial - BPEL-Prozess mit dynamischen Invoke auf Apache ODE in Eclipse 3.4 (Ganymede)

Hinweis: Dieses Tutorial ist im Rahmen der Übung zur Vorlesung Entwicklung service-orientierter Architekturen und Anwendungen (SOA) 2008 entstanden.

Autor: Kai Stapel
Version: 06.06.2011

In diesem Tutorial wird ein mehrsprachiger Hello-World-BPEL-Prozess mit dynamischen Invoke geschrieben (Dynamic Invoke Example), der in Apache ODE deployed wird. Der Prozess entscheidet anhand eines übergebenen Strings dynamisch zur Laufzeit, welcher von 4 HelloWorld-Webservices aufgerufen wird. Die Nachricht des aufgerufenen Webservice wird dann als Antwort des BPEL-Prozesses zurückgegeben.

Voraussetzungen

Dieses Tutorial setzt voraus, ...

Vorgehen

  1. BPEL-Projekt und BPEL-Prozess erstellen: Erstellen Sie ein neues Projekt in Eclipse. Nennen Sie das Projekt DynamicInvoke. Erstellen Sie in dem neuen Projekt einen Ordner DynamicInvokeProcess. Erstellen Sie darin einen neuen BPEL-Prozess mit dem selben Namen DynamicInvokeProcess.

    Screenshot: New BPEL Process Wizard

  2. Importieren der WSDL-Datei für die aufzurufenden Services: Im Rahmen dieses Tutorials werden wir dynamisch einen von vier Hello-World-Services aufrufen. Jeder der 4 Webservices gibt eine Hello-World-Nachricht in einer der 4 Sprachen Deutsch, Französisch, Spanisch oder Englisch zurück. Die WSDL zu den Services kann heruntergeladen werden. Die Services sind auf einem SE-Server deployed und können direkt genutzt werden. Alternativ können Sie auch den Service als deploybares WAR herunterladen und auf Ihrem eigenen Tomcat deployen.
    Kopieren Sie die WSDL-Datei in das DynamicInvokeProcess-Verzeichnis im Eclipse-Projekt DynamicInvoke (Rechtsklick -> Ziel speichern unter).

    Screenshot: Save HelloWorld WSDL file

    Updaten Sie anschließend ihr Projekt im Package-Explorer von Eclipse (F5), damit die gerade hinzugefügte WSDL sichtbar wird.

    Screenshot: Update process folder

  3. Invoke für dynamischen Webservice-Aufruf erstellen: Öffnen Sie die BPEL-Prozess-Datei im BPEL-Editor und fügen sie eine Invoke-Aktion zwischen Receive und Reply ein. Geben Sie dem Invoke einen sprechenden Namen, Z. B. DynamicHelloWorldInvoke.

    Screenshot: Insert Invoke Action

  4. Globalen Partnerlink erstellen: Wählen Sie die Invoke-Aktion aus und gehen Sie in die Detail-Ansicht der Properties-View. Wählen Sie dort im Dropdown-Menü von Partner Link:Create Global Partner Link. Nennen Sie den Partnerlink HelloWorldServicePartnerLink.

    Screenshot: Create Global Partner Link

    Wählen Sie im Choose Partner Link Type-Fenster Show Partner Link Types From Project und den Filter Show Port Types. Dadurch werden alle Port Types aus allen WSDL-Dateien im Projekt-Verzeichnis angezeigt, auch die, zu denen noch kein Partnerlink existiert.

    Screenshot: Choose Partner Link Type

    Wählen Sie den HelloWorldServicePortType und klicken Sie auf OK. Da zu diesem Porttype noch kein Partnerlink existiert, legt der Wizard einen neuen Partnerlink an. Geben Sie dem neuen Partner Link den Namen HelloWorldServicePartnerLinkType und klicken Sie auf Next.

    Screenshot: Enter Partner Link Type Name

    Im folgenden Fenster muss die Rolle des neuen Partner Links spezifiziert werden. Geben Sie den Rollennamen HelloWorldProvider ein und klicken Sie auf den Port Type HelloWorldServicePortType. Klicken Sie anschließend auf Finish. Die zweite Rolle braucht nicht angegeben zu werden.

    Screenshot: Enter Partner Link Type Role

    Wählen Sie nun die Operation des neuen Partnerlinks indem Sie im Bereich Quick Pick der Properties View direkt auf getMessage klicken. Dabei werden zwei neue Variablen für den Aufruf des Webservice mit den richtigen Datentypen angelegt.

    Screenshot: QuickPick Partner Link Operation

    Da unsere getMessage-Operation aber keinen Eingabeparameter hat müssen wir nun noch die Input-Variable löschen. Klicken Sie dazu im Dropdown-Menü der Input Variable auf Clear Input Variable.

    Screenshot: Clear Partner Link Input Variable

    Speichern Sie abschließend den BPEL-Prozess. Der Partnerlink für den Aufruf der Hello-World-Webservices wurde nun inklusive der nötigen Message-Variablen erfolgreich angelegt.
  5. Service-Reference-Namespace manuell hinzufügen: Um einen dynamischen Webservice-Aufruf realisieren zu können, brauchen wir eine Variable, die die Adresse des aufzurufenden Service enthält (Endpoint-Variable, engl.: Service Reference) um diese dynamisch, also zur Laufzeit des BPEL-Prozesses, dem Invoke (genauer dem PartnerLink) zuweisen zu können. Der BPEL-Standard sieht für Endpoint-Variablen einen eigenen Datentyp in einem separaten Namensraum vor. Daher müssen wir den Service-Reference-Namensraum xmlns:sref="http://docs.oasis-open.org/wsbpel/2.0/serviceref" zunächst in unserem BPEL-Prozess einbinden. Wechseln Sie dazu in die Source-Ansicht des Prozesses. und fügen sie dem BPEl-Root-Element bpel:process den Namensraum http://docs.oasis-open.org/wsbpel/2.0/serviceref mit dem Namen sref hinzu (Siehe Screenshot). Das dem Namensraum zugehörige BPEL Service Reference Schema braucht - zumindest bei Verwendung der BPEL-Engine ODE - nicht importiert werden.

    Screenshot: Insert Service Reference Namespace

  6. Enpoint-Variable erstellen und Element-Typ sref:service-ref manuell zuweisen: Jetzt erstellen wir die Endpoint-Variable. Wechseln Sie dazu zurück in die Design-Ansicht des BPEL-Editors. Klicken Sie auf das Plus-Symbol in der Variablen-Übersicht.

    Screenshot: Add Endpoint Variable

    Wechseln Sie noch einmal in die Source-Ansicht, um der neuen Variable den service-ref-Elementtyp zuzuweisen. Die Endpoint-Variable sollte wie folgt aussehen:
    <bpel:variable name="HelloWorldEndpoint" element="sref:service-ref"></bpel:variable>

    Screenshot: Add Endpoint Variable Element Type

    Speichern Sie den BPEL-Prozess.
    Damit die manuellen Änderungen vom BPEL-Designer erkannt werden, sollte man nun den Prozess einmal schließen und wieder neu öffnen.
  7. Entscheidung welcher Service aufzurufen ist mittels If-Aktivität: Fügen Sie eine If-Aktivität vor dem Invoke in den Prozess ein. Nennen Sie die Aktivität ChooseLangugae

    Screenshot: Insert If Activity

    Wir benötigen zwei ElseIf-Zweige und einen Else-Zweig, um folgende Entscheidungskaskade realisieren zu können:
    • Input-String "ger" → GermanHelloWorldService aufrufen
    • Input-String "esp" → SpanishHelloWorldService aufrufen
    • Input-String "fra" → FrenchHelloWorldService aufrufen
    • Sonst → EnglishHelloWorldService aufrufen
    Klicken Sie dazu im Kontextmenü der If-Aktivität zweimal auf Add ElseIf und einmal auf Add Else.

    Screenshot: Add ElseIf and Else

    Klicken Sie auf die If-Aktivität und öffnen Sie die Detail-Ansicht in den Properties. Stellen Sie sicher, dass Expression Language auf Same As Process steht und klicke Sie auf Create a New Condition.

    Screenshot: Create New Condition

    Geben Sie nun die Bedingung für die Auswahl des deutschen Hello-World-Service ein.
    $input.payload/tns:input='ger'

    Screenshot: EditCondition

    Verfahren Sie in den beiden ElseIf-Zweigen analog für Spanisch und Französisch. Speichern Sie den Prozess.
    $input.payload/tns:input='esp'
    $input.payload/tns:input='fra'
  8. Dynamisch Endpoints mittels Assign zuweisen: Fügen Sie nun in jeden der vier Zweige der If-Kaskade eine Assign-Aktion ein. Benennen Sie die Assigns entsprechend der jeweiligen Sprache.

    Screenshot: 4 Assigns in If-Cascade

    Weisen Sie in jedem der 4 Assigns der Enpoint-Variable entsprechend der Sprache ein Literal (Fixed Value) mit der URL des Service zu.
    <sref:service-ref xmlns:sref="http://docs.oasis-open.org/wsbpel/2.0/serviceref">
    <EndpointReference xmlns="http://www.w3.org/2005/08/addressing">
    	<Address>http://services.se.uni-hannover.de
    		/HelloWorldServices/services/GermanHelloWorldService</Address>
    </EndpointReference>
    </sref:service-ref>

    Screenshot: Assign Endpoint

  9. Endpoint-Variable dem Partner Link zuweisen: Nachdem jetzt die Endpoint-Variable dynamisch abhängig vom übergebenen Input-String gesetzt wurde, muss diese noch dem Partner-Link zugewiesen werden. Fügen Sie dazu oberhalb der Invoke-Aktivität ein weiteres Assign hinzu und nennen Sie es AssignEndpoint

    Screenshot: Assign Partner Link

    Kopieren Sie die Variable HelloWorldEndpoint mittels To: Partner Link Reference in den Partner Link HelloWorldServicePartnerLink. Speichern Sie den BPEL-Prozess.

    Screenshot: Assign Partner Link Properties

  10. Ergebnis des Invoke der Ausgabe zuweisen: Schließlich müssen wir das Ergebnis des Webservice-Aufrufs der output-Variable unseres Prozesses zuweisen. Fügen Sie dazu ein neues Assign vor das abschließende Reply und kopieren Sie den Inhalt der Variable, wie im Screenshot dargestellt. Lassen Sie sich vom Editor den Initializer generieren, wenn dieser danach fragt.

    Screenshot: Assign Response of Invoke to Output Variable

    Hinweis: Falls die Variable HelloWorldServicePartnerLinkResponse vom Typ getMessageResponse nicht richtig eingerichtet ist, man sich also weder den Part noch die ElementTypen ansehen kann, dann sollte man den MessageTyp neu zuweisen. Wählen Sie dazu in der Variablenübersicht die Variable HelloWorldServicePartnerLinkResponse und öffnen Sie die Properties-View → Details.

    Screenshot: ReassignMessageType

    Klicken Sie auf Browse. Im folgenden Fenster wählen Sie Show XSD Types → From Project und nur den Filter Messages. Wählen Sie getMessageResponse und klicken Sie auf OK.

    Screenshot: Choose Message Type

    Die Properties-View sollte danach wie folgt aussehen:

    Screenshot: New Partner Link Response Message Type

  11. Prozess deployen und testen: Damit sind alle Schritte für den dynamischen Aufruf der mehrsprachigen Hello-World-Webservices getan. Um den Prozess testen zu können, muss noch die WSDL erstellt und der Deployment-Descriptor erzeugt und eingestellt werden. WSDL:

    Screenshot: Final WSDL of BPEL-Prozess

    Im Deployment Descriptor muss zusätzlich der Service für den Partnerlink angeben werden. Wählen Sie dazu den Port aus.

    Screenshot: Deployment Descriptor

    Nun kann der dynamische mehrsprachige Hello-World-BPEL-Prozess auf ODE deployed und aufgerufen werden:

Eclipse-Projekte

Der DynamicInvoke-BPEL-Prozess kann direkt in Eclipse als Projekt importiert werden. Wählen Sie dazu jeweils Import → General → Existing Projects into Workspace → Select Archive File....

Die aufgerufenen mehrsprachigen Hello World Services können als ZIP als Eclipse-Projekt importiert werden (Import → General → Existing Projects into Workspace → Select Archive File...) oder als WAR-Archiv direkt im Axis-Container deployed werden.

Weiterführende Tutorials:

(Weitere Tutorials kommen)

Siehe auch:


Letzte Änderung: 06.06.2011 von Kai Stapel