訊息相關性是允許流程參與有狀態會話的 BPEL4WS 機制。訊息相關性有多種用途,例如,可以用它將回頭客或已知客戶匹配到長期啟動並執行商務程序。當針對某一項用 BPEL 實現的 Web 服務的的訊息抵達時,必須將該訊息傳送到適當的地方 - 不是傳送到流程的新執行個體,就是傳送到現有執行個體。訊息相關性所要解決的問題是確定一條訊息屬於哪個對話,在 BPEL 中,此項任務即是指定位/執行個體化一個執行個體。
在許多分布式對象系統中,路由一條訊息要涉及的一個方面就是檢查訊息的顯式 instance ID,後者標識目的地。儘管路由過程很相似,但 BPEL 執行個體不是由一個顯式的執行個體欄位標識,而是由所交換的訊息中的一個或多個關鍵字資料欄位集合來標識。例如,在訂單處理系統中,可以用訂單號來標識流程的一個特定執行個體。在 BPEL 術語中,這些用於標識流程執行個體的資料欄位的集合被稱為相關集。
每個 BPEL 相關集都有一個與之相關聯的名稱,該名稱由一些用 WSDL 定義的屬性群組成。 屬性在 WSDL 文檔中定義,是具有名稱的類型化資料元素,它的值通過應用一個特定於訊息的 XPath 運算式從 WSDL 訊息的執行個體中提取而得。在 WSDL 中,用 propertyAlias定義每一個這樣的映射。由於這些映射是特定於訊息的,因此單個 屬性可以有多個與之相關聯的 propertyAlias。例如,一個 WSDL 文檔可能陳述屬性 name同時對應於 WSDL 訊息 loginmsg中的 username組件和 WSDL 訊息 ordermsg中的 lastname組件。通過同時使用屬性和 propertyAlias,BPEL 創作者們就可以以一致的方式來引用資訊中的單個邏輯片段,即使這一片段在一組訊息中可能以不同的形式出現。
要使用相關集,BPEL 創作者可以通過枚舉組成該集合的各屬性來定義相關集,然後從 receive、 reply、 invoke或 pick活動引用該集合。BPEL 運行時使用這些定義和引用來確定它所感興趣的資訊片段,並在執行流程的不同階段檢查這些片段。流程的每個執行個體都會執行個體化為流程定義的每一個相關集。每個執行個體化(的過程)在流程執行個體的執行過程中恰好被初始化一次,隨後僅在涉及到比較傳入和傳出訊息時被使用。如果試圖重新初始化一個相關集,或者使用一個未被初始化的相關集,那麼運行時將會拋出一個 bpws:correlationViolation。提取由活動引用的相關集的值,無論是為了初始化還是為了比較,都會涉及到為組成該被引用的相關集的每個屬性應用 processAlias(這個 processAlias 與正被檢查的特定 WSDL 訊息相對應)。
因為 receive和 pick活動提供進入流程的進入點,所以相關集常常會出現在這些活動中,以支援訊息到執行個體的路由。如果一個相關集出現在 receive或 pick活動中,並且沒有將 initiation屬性設定為“yes”,那麼當調用那個特定的 receive或 pick活動的訊息抵達時,該活動就從傳入的訊息中提取組成該相關集的各屬性的值,並將所提取的值與儲存在那個流程的所有執行個體中的用於同一個相關集的值進行比較,然後將這個訊息路由到有匹配值的執行個體中。類似地, reply和 invoke活動(這兩種活動用於處理出站操作)中的相關集常常被用來驗證傳出訊息中包含的資料和指定相關集執行個體中包含的資料是一致的。例如,如果一個相關集出現在 reply活動中,並且沒有將 initiation屬性設定為“yes”,那麼該活動就從傳出訊息中提取組成該相關集的各屬性的值,並將這些值與所儲存的針對該執行個體的已執行個體化的相關集的值進行比較。如果發現對應於相關集的訊息中的值和那些包含在執行個體的相關集中的值不同,那麼運行時就會拋出一個 bpws:correlationViolation。在可以出現相關集的所有活動中, initiation屬性用來告訴運行時應該使用輸入到當前活動的訊息中所包含的值來初始化相關集。在 invoke活動中出現的相關集還有另一個屬性 pattern,它指定在 invoke活動執行過程中所要應用的相關集。 pattern屬性可以取值“in”,表示要在針對調用的響應返回的時候應用這個相關集,也可以取值“out”,表示在開始進行調用的時候就應用這個相關集,或者取值“both”,這自然表示在兩個階段都要應用這個相關集。
在單個活動中可以出現多個相關集,其中一些被初始化,一些用來作比較。目前的 BPEL 規範沒有定義根據多個相關集定位一個執行個體的語義。
轉自:http://blog.csdn.net/lggeor/archive/2007/11/05/1867005.aspx