1 9. Business Process Execution Language • Beobachtung: häufige Änderungen der Geschäftsprozesse • dies erfordert leichte und schnelle Software-Anpassung • Idee: ? Software in (Web-)Services gliedern (→ SOA) ? diese flexibel komponieren • hierzu: Business Process Execution Language (BPEL, WS-BPEL, BPEL4WS) 2 Einordnung Service−Registrierung UDDI Geschäftsprozess (Service−Komposition) BPEL Service−Implementierung Programmiersprache (Java, C#, ...) Service−Beschreibung WSDL Kommunikationsprotokoll SOAP 3 BPEL • universelle imperative Programmiersprache (“Turing-mächtig”) • auf die Komposition von Web-Servies zugeschnitten (→ domain specific language, DSL) • synchroner und asynchroner Aufruf von Web-Services • Zuweisung an Variablen • blockstrukturiert • Kontrollstrukturen Sequenz, Schleife, Verzweigung 4 BPEL (Fortsetzung) • Fehler- und Ereignisbehandlung, Kompensation • Nebenläufigkeit • BPEL-Prozesse sind selbst Web-Services (→ ggf. Rekursion) • Syntax basierend auf XML-Tags (→ bedingt menschenlesbar, graphische Tools) • aufbauend auf: XML Schema, XPath, WSDL, . . . 5 Was bietet BPEL nicht? • Benuter-Interaktion (→ Projekt BPEL4People) • Prozeduren, Methoden • Objekt-Orientierung 6 Vergleich: BPEL vs. Java als Koordinationssprache • Was kann BPEL, was Java nicht kann? nichts! • BPEL geeignet, wenn Koordinationslogik überschaubar • Java vorzuziehen bei komplexer Koordinationslogik 7 Ablauf eines BPEL-Programms • in BPEL-Engine BPEL-Engines: • ActiveBPEL Engine (Active Endpoints, frei verfügbar) • Websphere Business Integration Server Foundation (IBM) • alphaWorks (IBM) • BPEL Process Manager (Oracle) • BizTalk Server (Microsoft) • NetWeaver Exchange Infrastructure (SAP) • eInsight BPM (SeeBeyond) • WebLogic Integration / AquaLogic (BEA) • ... 8 Ähnliche Sprachen und Ansätze • XLANG/s (Microsoft) eingeflossen in BPEL • WSFL (Web Services Flow Language (WSFL, von IBM) eingeflossen in BPEL • BPML (Business Process Modeling Language, von BPMI.org) • WSCI (Web Service Choreography Interface, von Sun, SAP, BEA, . . . ) • BPSS (Business Process Specification Schema, Teil von ebXML) • WS-CDL (Web Service Collaboration Definition Language) • jBPM (JBoss) • ... • BPEL scheint sich durchzusetzen 9 Orchestrierung vs. Choreographie Orchestrierung Choreographie 1:receive WS 0 1: invoke Koordinator WS 0 n+2: reply 6: reply n+1: invoke 2: invoke WS 1 ... WS 2 WS n 5: invoke WS 1 • BPEL kann beides modellieren • BPEL-Engine kann nur Orchestrierung ausführen 2: invoke 3: reply 4: invoke WS 3 10 Orchestrierung • zentrale Koordination durch einen Web-Service • Ausführung durch BPEL-Engine • beteiligte Web-Services wissen nicht, wie und wo sie eingebunden sind • daher: neue Webservices können leicht eingebunden werden • meist verwendet in Firmen-internen Anwendungen • einfach zu überwachen • leichte Fehlerbehandlung 11 Choreographie • dezentral • keine zentrale Ausführung und Überwachung durch BPEL-Engine • beteiligte Web-Services wissen, wie sie mit ihren Nachbarn zusammenarbeiten • meist in Firmen-übergreifenden Anwendungen (z.B. SCM) • Überwachung und Fehlerbehandlung schwierig 12 Ausführbarer vs. Abstrakter Prozess Ausführbarer Prozess • basierend auf Orchestrierung • Koordinator wird von BPEL-Engine ausgeführt • Geschäftsprozess ist neuer Web-Service Abstrakter Prozess • beschreibt das (meist dezentrale) Zusammenwirken von Web-Services • nicht durch BPEL-Engine ausführbar • typischerweise verwendet bei Choreographie 13 BPEL-Sprachelemente • Deklarationen: ? <variable>: Variable ? <partnerLink>: Beziehung zu anderem Web-Service • Basis-Aktivitäten: ? <invoke>: synchroner oder asynchroner Aufruf von Web-Service ? <receive>: Empfang einer Nachricht von Client oder asynchron aufgerufenem Service ? <reply>: Senden einer Antwort an Client ? <assign>: Zuweisung ? <throw>: Exception bzw. Fehlerbehandlung auslösen ? <wait>: wartet Zeitspanne (for) oder bis Zeitpunkt (until) ? <terminate>: Beenden 14 BPEL-Sprachelemente (Fortsetzung) • zusammengesetzte Aktivitäten: ? <sequence>: sequentielle Komposition von Aktivitäten ? <flow>: parallele Komposition ? <switch>: Verzweigung ? <while>, <repeatUntil>, <forEach>: übliche Schleifen ? <pick>: wartet auf Ereignis • Strukturierungs-Tags: ? <process>: umschließt BPEL-Programm ? <variables>, <partnerlinks>, . . . : zur Zusammenfassung von Deklarationen 15 8: reply <invoke(sync)> Hole Angebot von Hotel 1 <invoke(sync)> Hole Angebot von Hotel 2 [Hotel1.preis < Hotel2.preis] [sonst] <assign> Wähle Angebot 1 <assign> Wähle Angebot 2 <reply> Client antworten porttype Client <receive> Client−Auftrag annehmen 2: invoke porttype 1: invoke porttype Beispiel: Hotelvermittlungs-Service 3: invoke WS Hotel 1 4: reply WS Hotel 2 5: reply 16 Beispiel: Partnerlinks für Hotelvermittlungs-Service <partnerLinks> <partnerLink name = "client" partnerLinkType = "clt:vermittlungLT" myRole = "hotelVermittlungsService"/> <partnerLink name = "hotel1" partnerLinkType = "hotel:hotelLT" myRole = "hotelKunde"/> <partnerLink name = "hotel2" partnerLinkType = "hotel:hotelLT" myRole = "hotelKunde"/> </partnerLinks> 17 Beispiel: Variablen für Hotelvermittlungs-Service <variables> <variable name = "VermittlungsAnfrage" messageType = "hotel:HotelAnfrageNachricht"/> <variable name = "Hotel1Antwort" messageType = "hotel:HotelAntwortNachricht"/> <variable name = "Hotel2Antwort" messageType = "hotel:HotelAntwortNachricht"/> <variable name = "VermittlungsAntwort" messageType = "hotel:HotelAntwortNachricht"/> </variables> 18 Beispiel: BPEL-Prozess für Hotelvermittlungs-Service <?xml version="1.0" encoding="utf-8"?> <process name= "HotelVermittlungsProzess" targetNameSpace="http://hotelvermittlung.com/bpel/hotelbsp/" xmlns="http//schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:clt="http://hotelvermittlung.com/bpel/client/" xmlns:hotel="http://hotelvermittlung.com/bpel/hotel/"> <partnerLinks> ... s.o. ... </partnerLinks> <variables> ... s.o. ... </variables> <sequence> <receive partnerLink = "client" ... /> <flow> <invoke partnerLink = "hotel1" ... /> <invoke partnerLink = "hotel2" ... /> </flow> <switch> ... </switch> <reply partnerLink = "client" ... /> </sequence> </process> 19 Kontrollfluss im Beispiel im Detail (1) <sequence> <receive partnerLink = "client" portType = "clt:HotelVermittlungsServicePT" operation = "VermittleHotel" variable = "VermittlungsAnfrage" createInstance = "yes"/> <flow> <invoke partnerLink = "hotel1" portType = "hotel:BerechneHotelPreisPT" operation = "BerechneHotelPreis" inputVariable = "Vermittlungsanfrage" outputVariable = "Hotel1Antwort"/> <invoke partnerLink = "hotel2" portType = "hotel:BerechneHotelPreisPT" operation = "BerechneHotelPreis" inputVariable = "Vermittlungsanfrage" outputVariable = "Hotel2Antwort"/> </flow> ... 20 Kontrollfluss im Beispiel im Detail (2) ... <switch> <case condition = "bpws:getVariableData(’Hotel1Antwort’, ’BestaetigungsDaten’, ’/BestaetigungsDaten/hotel:Betrag’) &lt; bpws:getVariableData(’Hotel2Antwort’, ’BestaetigungsDaten’, ’/BestaetigungsDaten/hotel:Betrag’)"> <assign> <copy> <from variable = "Hotel1Antwort"/> <to variable = "VermittlungsAntwort"/> </copy> </assign> </case> <otherwise> <assign> <copy> <from variable = "Hotel2Antwort"/> <to variable = "VermittlungsAntwort"/> </copy> </assign> </otherwise> </switch> ... 21 Kontrollfluss im Beispiel im Detail (3) ... <reply partnerLink = "client" portType = "clt:HotelVermittlungPT" operation = "WaehleHotel" variable = "VermittlungsAntwort"/> </sequence> </process> 22 Synchrone vs. Asynchrone Aufrufe von Web-Services synchron: invoke asynchron: 1: Anfrage Client receive Web−Service 2: Antwort reply • <invoke> wartet auf das Ergebnis • und nimmt es entgegen invoke 1: Anfrage Client receive Web−Service receive 2: Antwort invoke • <invoke> wartet nicht • <receive> nimmt Ergebnis später entgegen • Vor.: 2 Porttypes (one-way) in WSDL 23 Partnerlink-Typen • Partnerlink-Typen erlauben, die Rolle eines Web-Service in einer Beziehung anzugeben Beispiel: <partnerLinkType name = "HotelLT" xmlnd="http://schemas.xmlsoap.org/ws/2003/05/partner-link"/> <role name = "HotelVermittlungsService"> <portType name = "hotel:BerechneHotelPreisPT"/> </role> <role name = "hotelKunde"> <portType name = "hotel:BerechneHotelPreisCallBackPT"/> </role> </partnerLinkType> • Partnerlink-Typen werden nicht im BPEL-Prozess sondern im WSDL-Dokument angegeben 24 Partner-Links Beispiel: <partnerLink name = "hotel1" partnerLinkType = "hotel:hotelLT" myRole = "hotelKunde" partnerRole = "hotel"/> • Verweis auf benachbarten Web-Service • Attribute: ? name: Name des Partnerlinks ? partnerLinkType: Typ des Partnerlinks ? myRole: eigene Rolle in der Beziehung ? partnerRole: Rolle des Partners in der Beziehung 25 Variablen Variablentypen: • messagetype: Variable speichert WSDL-Nachricht • element: . . . XML Schema-Element • type: . . . Wert eines XML Schema Basistyps (int, double, string, . . . ) Beispiel: <variables> <variable name = "VermittlungsAnfrage" messageType = "hotel:HotelAnfrageNachricht"/> <variable name = "Adresse" element = "hotel:KundenAngaben"/> <variable name = "Preis" type = "xs:int"/> </variables> • Variablen können global oder lokal sein (→ <scope>) 26 Zuweisungen Beispiel: <assign> <copy> <from variable = "Hotel1Antwort"/> <to variable = "VermittlungsAntwort"/> </copy> </assign> • mehrere Kopieroperationen pro <assign> möglich • es können auch Teile einer Nachricht (vgl. WSDL) und Komponenten davon kopiert bzw. verändert werden • die Auswahl der Komponenten erfolgt (z.B.) mit XPath • die <from>-Klausel kann auch Konstanten und arithmetische Ausdrücke enthalten 27 Beispiel: Zuweisung <assign> <copy> <from expression="number(42)"/> <to variable = "Preis"/> </copy> <copy> <from expression = "bpws:getVariableData(’Preis’)+1> <to variable = "HotelAntwort" part="Angebot" query="/Angebot/hotel:Preis"/> </copy> </assign> zugehöriges WSDL: <message name = "HotelAntwort"> <part name="KundenDaten" type="hotel:KundenDatenTyp"/> <part name="Angebot" type="hotel:AngebotsTyp"/> </message> zugehörige Typ-Deklaration: <xs:complexType name="Angebotstyp"> <xs:sequence> <xs:element name="Preis" type="xs:int"/> <xs:element name="MWST" type="xs:double"/> </xs:sequence> </xs:complexType> 28 Bedingungen • verwendet in Verzweigungen und Schleifen • erlaubt sind beliebige boolesche XPath-Ausdrücke • hierin: ? Variablen, Konstanten ? Vergleichsoperationen: &eq; &ne; &gt; &ge; &lt; &le; ? boolesche Operationen: &and; &or; • Erweiterung: getVariableData-Funktion zum Zugriff auf Variablen bpws:getVariableData(’Variablenname’, ’Part-name’, ’path’) • die letzten beiden Argumente sind optional 29 Beispiel: Bedingung <switch> <case condition = "bpws:getVariableData(’Hotel1Antwort’, ’BestaetigungsDaten’, ’/BestaetigungsDaten/hotel:Betrag’) &lt; 100"> ... 30 <invoke>, <receive> und <reply> Attribute: • partnerLink, portType, operation (aus WSDL-Dokument!) • <invoke> zusätzlich: inputVariable, outputVariable • <receive> zusätzlich: ? variable: speichert erhaltene Nachricht ? createInstance (y/n): ∗ gibt an, ob bei Erhalt der Nachricht eine neue Instanz des Web-Service erzeugt werden soll ∗ bei initialem <receive> vom Client: yes ∗ bei Callback: no • <reply> zusätzlich: variable mit Antwort 31 Fehlerbehandlung Auslösen von Fehlern • innerhalb von Web-Service: führt zu fault-Antwort • mit <throw> Abfangen von Fehlern • mit <catch>: fängt ausgewählten Fehler ab • mit <catchAll>: fängt beliebigen Fehler ab 32 Beispiel: Fehlerbehandlung <scope name="HotelAufruf"> <faultHandlers> <catchAll> <!-- falls Hotel nicht erreichbar: Preis = 999999 --> <assign> <copy> <from expression="number(999999)"/> <to variable = "Hotel1Antwort" part="Angebot" query="/Angebot/hotel:Preis"/> </copy> </assign> </catchAll> </faultHandlers> <invoke partnerLink = "hotel1" portType = "hotel:BerechneHotelPreisPT" operation = "BerechneHotelPreis" inputVariable = "Vermittlungsanfrage" outputVariable = "Hotel1Antwort"/> </scope> 33 <pick> • wartet auf eins von mehreren möglichen Ereignissen (inkl. Nachrichteneingang) <pick> <onMessage partnerLink="meinPartner" portType="meinServicePT" operation="meinService" variable="ergebnis"> <!-- bearbeite Nachricht --> </onMessage> <onAlarm ...> <!-- bearbeite Alarm durch Zeitueberschreitung--> </onAlarm> </pick>