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 Geschäftsprozess (Service Komposition) BPEL Service Registrierung UDDI 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 WS 0 1:receive n+2: reply Koordinator WS 0 1: invoke 6: reply WS 2 WS 1... 2: invoke WS n n+1: invoke 5: invoke 3: reply 2: invoke 4: invoke WS 1 WS 3 BPEL kann beides modellieren BPEL-Engine kann nur Orchestrierung ausführen
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 Prozess Ausführbarer vs. Abstrakter 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 Beispiel: Hotelvermittlungs-Service Client 1: invoke 8: reply porttype <invoke(sync)> Hole Angebot von Hotel 1 [Hotel1.preis < Hotel2.preis] <receive> Client Auftrag annehmen <invoke(sync)> Hole Angebot von Hotel 2 [sonst] porttype porttype 2: invoke 4: reply 3: invoke 5: reply WS Hotel 1 WS Hotel 2 <assign> Wähle Angebot 1 <assign> Wähle Angebot 2 <reply> Client antworten
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>...
Kontrollfluss im Beispiel im Detail (2)... <switch> <case condition = "bpws:getvariabledata( Hotel1Antwort, BestaetigungsDaten, /BestaetigungsDaten/hotel:Betrag ) < 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>... 20
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: asynchron: invoke 1: Anfrage receive invoke 1: Anfrage receive Client Web Service Client Web Service 2: Antwort reply receive 2: Antwort invoke <invoke> wartet auf das Ergebnis und nimmt es entgegen <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 Beispiel: Partner-Links <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 <assign> <copy> </copy> <copy> </copy> </assign> zugehöriges WSDL: Beispiel: Zuweisung <from expression="number(42)"/> <to variable = "Preis"/> <from expression = "bpws:getvariabledata( Preis )+1> <to variable = "HotelAntwort" part="angebot" query="/angebot/hotel:preis"/> <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" </xs:sequence> </xs:complextype> type="xs:double"/>
28 Bedingungen verwendet in Verzweigungen und Schleifen erlaubt sind beliebige boolesche XPath-Ausdrücke hierin: Variablen, Konstanten Vergleichsoperationen: &eq; > < boolesche Operationen: 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 ) < 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 <scope name="hotelaufruf"> Beispiel: Fehlerbehandlung <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>