WS-BPEL語言基礎(chǔ)
16.1.
WS-BPEL
語言基礎(chǔ)
在我們能夠設(shè)計(jì)編排層之前,我們需要很好地理解如何正式地表達(dá)流程的操作特征。本書使用
WS-BPEL
語言來演示流程邏輯如何能夠被作為具體定義的一部分來描述(
圖
16.1
),從而能夠通過相適應(yīng)的編排引擎來實(shí)現(xiàn)和執(zhí)行。
圖
16.1.
常見的
WS-BPEL
流程定義結(jié)構(gòu)
雖然你很可能會(huì)使用流程建模工具并因此不需要從草稿開始編寫你的流程,
WS-BPEL
元素的知識(shí)仍舊是有用的和必需的。
WS-BPEL
建模工具經(jīng)常會(huì)涉及到這些元素和結(jié)構(gòu),而且你可能深入到它們生成的代碼中做進(jìn)一步的精化。
注意
如果你已經(jīng)輕松了解了
WS-BPEL
語言,請(qǐng)向前跳到
面向服務(wù)業(yè)務(wù)流程設(shè)計(jì)(
循序漸進(jìn)的流程
)
章節(jié)。
16.1.1.
BPEL
4WS
與
WS-BPEL
簡(jiǎn)史
在我們進(jìn)入
WS-BPEL
語言的細(xì)節(jié)之前,讓我們簡(jiǎn)要討論一下這個(gè)規(guī)范是如何形成的。
Web
服務(wù)業(yè)務(wù)流程執(zhí)行語言(
BPEL
4WS
)最初在
2002
年
7
月被構(gòu)思和發(fā)布,伴以
BPEL
4WS 1.0
規(guī)范,這是
IBM
、
Microsoft
和
BEA
合作的成果。這個(gè)文檔提議了從先前的各種語言中得到靈感的編排語言,例如
IBM
的
Web
服務(wù)流程語言(
WSFL
)
與
Microsoft
的
XLANG
規(guī)范。
隨著來自于
SAP
和
Siebel Systems
等其他貢獻(xiàn)者的加入,版本
1.1
的
BPEL
4WS
規(guī)范在一年不到的時(shí)間,于
2003
年
5
月發(fā)布了。這個(gè)版本獲得了更多的關(guān)注與廠商支持,導(dǎo)致了大量的商業(yè)上遵循
BPEL
4WS
的可用編排引擎。正是在這個(gè)發(fā)布之前,
BPEL
4WS
規(guī)范被提交到
OASIS
技術(shù)委員會(huì),使得這個(gè)規(guī)范能夠被開發(fā)成為一個(gè)官方的、開放的標(biāo)準(zhǔn)。
技術(shù)委員會(huì)正在下一個(gè)版本
BPEL
4WS
的最終發(fā)布流程中。它已經(jīng)宣布了語言本身被重新命名為
Web
服務(wù)業(yè)務(wù)流程執(zhí)行語言,或者是
WS-BPEL
(并被賦予
2.0
版本號(hào))。
WS-BPEL
所規(guī)劃的變更目前已經(jīng)對(duì)外公布,并可在
OASIS
的
Web
網(wǎng)站
www.oasis-open.org
上獲得。
在本節(jié)的元素描述中加入了注釋,以利于指出
BPEL
4WS
與
WS-BPEL
之間的語法變動(dòng)。為了簡(jiǎn)單起見,在本書中我們提到的業(yè)務(wù)流程執(zhí)行語言就是指
WS-BPEL
。
16.1.2.
先決條件
現(xiàn)在是學(xué)習(xí)
WS-BPEL
語言的時(shí)候了。如果你還沒有準(zhǔn)備好,推薦你在繼續(xù)本節(jié)之前閱讀第
6
章。第
6
章中涉及了編排、協(xié)調(diào)、原子事務(wù)和業(yè)務(wù)活動(dòng)等相關(guān)概念,因而在此就不再重復(fù)。本章同時(shí)也假設(shè)你已經(jīng)通讀了第
13
章中提供的
WSDL
教程。
16.1.3.
process
元素
讓我們從
WS-BPEL
流程定義的根元素開始。它使用
name
屬性來給一個(gè)名稱賦值,并用于建立流程定義相關(guān)的命名空間。
示例
16.1.
process
定義框架
<process name=“TimesheetSubmissionprocess”
targetNamespace=“http://www.xmltc.com/tls/process/”
xmlns=
“http://schemas.xmlsoap.org/ws/2003/03/
business-process/”
xmlns:bpl=“http://www.xmltc.com/tls/process/”
xmlns:emp=“http://www.xmltc.com/tls/employee/”
xmlns:inv=“http://www.xmltc.com/tls/invoice/”
xmlns:tst=“http://www.xmltc.com/tls/timesheet/”
xmlns:not=“http://www.xmltc.com/tls/notification/”>
<partnerLinks>
...
</partnerLinks>
<variables>
...
</variables>
<sequence>
...
</sequence>
...
</process>
process
結(jié)構(gòu)包含一系列常見的子元素,在下列章節(jié)中說明。
16.1.4.
partnerLinks
與
partnerLink
元素
partnerLink
元素建立了端口類型的服務(wù)(伙伴),將參與業(yè)務(wù)流程的執(zhí)行過程。伙伴服務(wù)能夠擔(dān)當(dāng)流程的客戶端,負(fù)責(zé)調(diào)用流程服務(wù)。作為替代,伙伴服務(wù)也能夠被流程服務(wù)自身所調(diào)用。
partnerLink
元素的內(nèi)容代表了兩個(gè)合作伙伴之間的通信交換
---
流程服務(wù)是一個(gè)合作伙伴其他服務(wù)是另一個(gè)合作伙伴。依據(jù)通信的種類,流程服務(wù)的作用將會(huì)變化。例如,被外部服務(wù)所調(diào)用的流程服務(wù)可能擔(dān)當(dāng)
“工單提交流程(
TimesheetSubmissionProcess
)”的角色。然而,當(dāng)這個(gè)同樣的流程服務(wù)調(diào)用具有發(fā)票校驗(yàn)的不同服務(wù)的時(shí)候,它擔(dān)當(dāng)了不同的角色,或許是“發(fā)票客戶(
InvoiceClient
)”。
partnerLink
元素因而包含
myRole
與
partnerRole
屬性,分別設(shè)立了流程服務(wù)和伙伴服務(wù)服務(wù)提供者的角色。
為簡(jiǎn)單起見,
myRole
屬性用于流程服務(wù)被伙伴客戶端服務(wù)所調(diào)用時(shí),因?yàn)樵谶@個(gè)情況下流程服務(wù)擔(dān)當(dāng)了服務(wù)提供者。
partnerRole
屬性識(shí)別了流程服務(wù)所調(diào)用的伙伴服務(wù)(使伙伴服務(wù)成為服務(wù)提供者)。
注意當(dāng)期望的流程服務(wù)在相同的伙伴服務(wù)中擔(dān)當(dāng)服務(wù)請(qǐng)求者和服務(wù)提供者的時(shí)候,
myRole
與
partnerRole
屬性都能夠被相同的
partnerLink
元素所使用。例如,在流程和伙伴服務(wù)的異步通信過程中,在伙伴服務(wù)回調(diào)期間
myRole
的設(shè)置顯示出流程服務(wù)的角色。
示例
16.2.
partnerLinks
結(jié)構(gòu)包含一個(gè)
partnerLink
元素,在該元素內(nèi)流程服務(wù)被一個(gè)外部客戶端伙伴所調(diào)用,并且四個(gè)
partnerLink
元素確定了被流程服務(wù)所調(diào)用的伙伴服務(wù)
<partnerLinks>
<partnerLink name=“client”
partnerLinkType=“tns:TimesheetSubmissionType”
myRole=“TimesheetSubmissionServiceProvider”/>
<partnerLink name=“Invoice”
partnerLinkType=“inv:InvoiceType”
partnerRole=“InvoiceServiceProvider”/>
<partnerLink name=“Timesheet”
partnerLinkType=“tst:TimesheetType”
partnerRole=“TimesheetServiceProvider”/>
<partnerLink name=“Employee”
partnerLinkType=“emp:EmployeeType”
partnerRole=“EmployeeServiceProvider”/>
<partnerLink name=“Notification”
partnerLinkType=“not:NotificationType”
partnerRole=“NotificationServiceProvider”/>
</partnerLinks>
你會(huì)在
示例
16.2
中注意到,每個(gè)
partnerLink
元素同樣也包含了
partnerLinkType
屬性。這涉及到
partnerLinkType
結(jié)構(gòu),在下面說明。
16.1.5.
partnerLinkType
元素
對(duì)于包含在流程中的每個(gè)伙伴服務(wù),
partnerLinkType
元素在流程定義中確定了被
partnerLink
元素引用的
WSDL
portType
元素。因此,這些結(jié)構(gòu)典型地都直接嵌入到每個(gè)伙伴服務(wù)的
WSDL
文檔中(包括流程服務(wù))。
正如
partnerLink myRole
與
partnerRole
屬性所定義的那樣,
partnerLinkType
結(jié)構(gòu)為每個(gè)服務(wù)可以擔(dān)當(dāng)?shù)慕巧粋€(gè)
role
元素。其結(jié)果是,
partnerLinkType
將具有一個(gè)或兩個(gè)
role
子元素。
示例
16.3. WSDL
定義
結(jié)構(gòu)包含
partnerLinkType
結(jié)構(gòu)
<definitions name=“Employee”
targetNamespace=“http://www.xmltc.com/tls/employee/wsdl/”
xmlns=“http://schemas.xmlsoap.org/wsdl/”
xmlns:plnk=
“http://schemas.xmlsoap.org/ws/2003/05/partner-link/”
...
>
...
<plnk:partnerLinkType name=“EmployeeServiceType” xmlns=
“http://schemas.xmlsoap.org/ws/2003/05/partner-link/”>
<plnk:role name=“EmployeeServiceProvider”>
<portType name=“emp:EmployeeInterface”/>
</plnk:role>
</plnk:partnerLinkType>
...
</definitions
>
注意多個(gè)
partnerLink
元素可以引用相同的
partnerLinkType
。這當(dāng)流程服務(wù)與多個(gè)伙伴服務(wù)具有相同關(guān)系的時(shí)候十分有用。所有的伙伴服務(wù)因而能夠使用相同的流程服務(wù)的
portType
元素。
注意
在
2.0
版本的
WS-BPEL
規(guī)范中,提議了
portType
元素的變更以便作為
role
元素的一個(gè)屬性存在。
16.1.6.
variables
元素
WS-BPEL
流程服務(wù)通常使用
variables
結(jié)構(gòu)來保存與即時(shí)工作流邏輯關(guān)聯(lián)的狀態(tài)信息。整個(gè)消息和數(shù)據(jù)集合被格式化為
XSD schema
類型,能夠在處理過程中被置入變量并在以后獲取。數(shù)據(jù)的類型能夠被賦予
variable
元素,它需要用下面三個(gè)屬性之一來預(yù)定義:
messageType
,
element
,或
type
.
messageType
屬性允許變量包含整個(gè)
WSDL
定義的消息,而
element
屬性完全引用了
XSD
元素結(jié)構(gòu)。
type
屬性能夠用于僅代表
XSD
simpleType
,如
string
或
integer
。
示例
16.4.
variables
結(jié)構(gòu)僅包含一些后續(xù)被工單提交流程所使用的
variable
子元素
<variables>
<variable name=“ClientSubmission”
messageType=“bpl:receiveSubmitMessage”/>
<variable name=“EmployeeHoursRequest”
messageType=“emp:getWeeklyHoursRequestMessage”/>
<variable name=“EmployeeHoursResponse”
messageType=“emp:getWeeklyHoursResponseMessage”/>
<variable name=“EmployeeHistoryRequest”
messageType=“emp:updateHistoryRequestMessage”/>
<variable name=“EmployeeHistoryResponse”
messageType=“emp:updateHistoryResponseMessage”/>
...
</variables>
典型地來講,具有
messageType
屬性的變量是為流程定義所處理的每個(gè)輸入和輸出消息定義的。這個(gè)屬性的值是來自于伙伴流程定義的消息名稱。
16.1.7.
getVariableProperty
與
getVariableData
功能
WS-BPEL
提供內(nèi)置函數(shù),允許存儲(chǔ)在變量中或者是與變量關(guān)聯(lián)的信息能在業(yè)務(wù)流程執(zhí)行期間被處理。
getVariableProperty
(
variable name
,
property name
)
這個(gè)函數(shù)允許從變量中接收全局的屬性值。它完全接受了作為輸入的值和屬性名稱,并返回所要求的值。
getVariableData
(
variable name
,
part name
,
location path
)
由于變量通常用于管理狀態(tài)信息,這個(gè)函數(shù)要求提供訪問數(shù)據(jù)的其他部分處理邏輯。
getVariableData
函數(shù)具有一個(gè)強(qiáng)制的變量名稱參數(shù)和兩個(gè)能夠用于指定變量數(shù)據(jù)的可選變量。
在我們的示例中我們多次使用
getVariableData
函數(shù)來從變量中獲取消息數(shù)據(jù)。
示例
16.5.
兩個(gè)
getVariableData
函數(shù)被用于接收來自于不同變量的特定數(shù)據(jù)
getVariableData
(
'InvoiceHoursResponse'
,
'ResponseParameter'
)
getVariableData
(
'input'
,
'payload'
,
'/tns:TimesheetType/Hours/...'
)
16.1.8.
sequence
元素
sequence
結(jié)構(gòu)允許你組織一系列的活動(dòng)以便它們以預(yù)定義的、有順序的次序執(zhí)行。
WS-BPEL
提供了大量能夠用于在流程定義中表示工作流邏輯的活動(dòng)。在本節(jié)中剩余的元素描述解釋了一組基本的用于我們將要進(jìn)行案例研究示例的一部分活動(dòng)。
示例
16.6.
sequence
結(jié)構(gòu)框架僅包含了
WS-BPEL
所提供的許多活動(dòng)元素中的一些
<sequence>
<receive>
...
</receive>
<assign>
...
</assign>
<invoke>
...
</invoke>
<reply>
...
</reply>
</sequence>
注意
sequence
元素可以嵌套,允許你在序列中定義序列。
16.1.9.
invoke
元素
該元素識(shí)別了伙伴服務(wù)的操作,這是流程定義計(jì)劃在其執(zhí)行過程中要調(diào)用的。
invoke
元素配備了五個(gè)常見屬性,進(jìn)一步詳細(xì)說明了條文的細(xì)節(jié)(
表
16.1
)。
表
16.1.
invoke
元素屬性
屬性 |
描述 |
partnerLink
|
該元素通過相應(yīng)的
partnerLink
來命名伙伴服務(wù)。
|
portType
|
該元素用于識(shí)別伙伴服務(wù)的
portType
元素。
|
operation
|
流程服務(wù)需要發(fā)送請(qǐng)求到的伙伴服務(wù)操作。
|
inputVariable
|
輸入消息將用于和伙伴服務(wù)操作進(jìn)行通信。注意這里所提及的是作為變量,因?yàn)樗昧司哂?/span>
messageType
屬性的
WS-BPEL
變量。
|
outputVariable
|
當(dāng)基于請(qǐng)求
-
響應(yīng)的
MEP
進(jìn)行通信的時(shí)候采用該元素。返回值存儲(chǔ)在單獨(dú)的
variable
元素中。
|
示例
16.7.
invoke
元素確定了目標(biāo)伙伴服務(wù)的細(xì)節(jié)
<invoke name=“ValidateWeeklyHours”
partnerLink=“Employee”
portType=“emp:EmployeeInterface”
operation=“GetWeeklyHoursLimit”
inputVariable=“EmployeeHoursRequest”
outputVariable=“EmployeeHoursResponse”/>
16.1.10. receive 元素
receive 元素允許我們建立流程服務(wù)期望從外部客戶端伙伴服務(wù)中接收請(qǐng)求的信息。在這個(gè)案例中,流程服務(wù)被視作是等待調(diào)用的服務(wù)提供者。
receive 元素包含一組屬性,它們中的每一個(gè)都被賦值,涉及到預(yù)期進(jìn)來的通信( 表 16.2 )。
表 16.2. receive 元素屬性
屬性 |
描述 |
partnerLink |
客戶端伙伴服務(wù)在相應(yīng)的 partnerLink 結(jié)構(gòu)中被識(shí)別。 |
portType |
流程服務(wù) portType 會(huì)等待從伙伴服務(wù)中接收請(qǐng)求消息。 |
operation |
會(huì)接收請(qǐng)求的流程服務(wù)操作。 |
variable |
進(jìn)來的請(qǐng)求消息將會(huì)被存儲(chǔ)在流程定義的 variable 結(jié)構(gòu)中。 |
createInstance |
當(dāng)這個(gè)屬性被設(shè)置成“ yes ”的時(shí)候,這個(gè)特殊請(qǐng)求的可能負(fù)責(zé)創(chuàng)建新的進(jìn)程實(shí)例。 |
注意這個(gè)元素同樣能夠被用于在異步消息交換的過程中接收回調(diào)消息。
示例 16.8. 用于工單提交流程定義的 receive 元素預(yù)示著客戶端的伙伴服務(wù)負(fù)責(zé)啟動(dòng)工單文擋提交流程
<receive name=“receiveInput”
partnerLink=“client”
portType=“tns:TimesheetSubmissionInterface”
operation=“Submit”
variable=“ClientSubmission”
createInstance=“yes”/>