Business Process Execution Language

Transcription

Business Process Execution Language
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>