2.1 Tổng quan về ngôn ngữ BPEL
2.1.4 Các thành phần và ký hiệu trong BPEL
Một tiến trình BPEL đƣợc thể hiện qua các Activity, các Activity trong BPEL đƣợc thực hiện tuần tự theo cấu trúc đƣợc khai báo trong tiến trình. Trong BPEL 2.0 thì các Activity đƣợc chia làm ba nhóm cơ bản nhƣ sau:
Basic Activity: là các Activity đơn thể, nó không thể chứa đƣợc bất kỳ các Activity nào khác bên trong nó nữa.
Structure Activity: là các Activity có cấu trúc, nó có thể chứa đƣợc các Activity khác bên trong nó.
Faul Handle Activity: các Activity này đƣợc sử dụng để thụ lý lỗi và các ngoại lệ xảy ra trong quá trình hoạt động của một tiến trình.
Tùy theo nhu cầu và trong các trường hợp cụ thể mà ta có thể chọn và sử dụng các Activity khác nhau. Bảng sau mô tả chi tiết về các Activity trong BPEL 2.0:
24
Tên Activity Ký hiệu Các trường hợp sử dụng Các Activity cơ bản
Empty
Là một activity đặc biệt, không làm gì hết khi đƣợc gọi. Activity này đƣợc dùng khi cần có một activity nhƣng không thật sự cần một hành động nào xảy ra.
Invoke Gọi một webservice để thực hiện một tác vụ nào đó Receive Nhận một thông điệp t một service partner. Thông
thường đây là activity bắt đầu một tiến trình mới Reply Gửi trả một thông điệp cho một đối tƣợng bên ngoài
tiến trình Opaque
Activity
Là một Activity dạng dẫn xuất
Assign Dùng để khởi tạo hoặc gán giá trị cho các biến trong tiến trình BPEL
Validate
Kiểm tra tính hợp lệ của các biến và các biểu thức dựa trên định nghĩa của nó (chẳng hạn định nghĩa dựa trên XML Schema, hay WSDL…)
Các Activity điều khiển và có cấu trúc
If/Else Định nghĩa cấu trúc điều kiện
Pick
Đinh nghĩa cách lựa chọn phương án hành động (hành động nào sẽ được thực hiện khi sự kiện tương ứng mà nó quy định xảy ra, nếu không có sự kiện nào xảy ra trong một thời gian chỉ định trước thì hành động nào sẽ đƣợc thực hiện…)
While Lặp lại một tiến trình con nào đó trong process ở dạng while
25
RepeatUntil Lặp lại một tiến trình con nào đó trong process ở dạng do..while
Foreach Định nghĩa vòng lặp để duyệt qua một tập hợp
Wait D ng tiến trình trong một khoản thời gian đƣợc thiết lập trước
Sequence Dùng để thiết lập tuần tự hoạt động của các Activity
Scope
Dùng để chia nhỏ tiến trình thành các activity có các nhiệm vụ liên quan với nhau (khi tiến trình trở nên phức tạp).
Các Activity dùng để quản lý lỗi và ngoại lệ
Exit D ng tiến trình hiện tại
Throw Ném ra một ngoại lệ
Rethrow Ném ra thông báo lỗi sau khi lỗi này đã đƣợc thụ lý trước đó
Compensate Scope
Là activity dùng để thụ lý lỗi. Khi có lỗi xảy ra thì activity này sẽ đƣợc dùng để xử lý lỗi trên phạm vi đƣợc chỉ ra
Compensate
Có chức năng cũng giống nhƣ activity Compensate Scope nhƣng đƣợc dùng để thụ lý lỗi trên phạm vi tất cả các phạm vi liên quan
Bảng 2.3-Các Activity trong BPEL 2.0
Sau đây là mô tả chi tiết và các trường hợp sử dụng của t ng Activity:
Receive
Khi một tiến trình BPEL cần nhận một thông điệp thì activity receive sẽ đƣợc sử dụng. Receive activity sẽ xác định đƣợc dịch vụ đối tác mà nó đƣợc nhận thông điệp và các Operation t dịch vụ đối tác mà nó cần phải gọi thông qua PartnerLink và Operation. Để thực thi đƣợc thì receive activity phải xác định đƣợc một biến đầu vào (input) hoặc phần dữ liệu mà nó đƣợc nhận. Cấu trúc XML của receive activity đƣợc thể hiện nhƣ sau:
26 1
2 3 4 5 6 7 8 9 10 11 12 13
<receive partnerLink=”NCName” portType=”QName”?
operation=”NCName”
variable=”BPELVariableName”? createInstance=”yes|no”?
messageExchange=”NCName”?
standard-attributes>
standard-elements
<correlations>?
<correlation set=”NCName” initiate=”yes|join|no”?>+
</correlations>
<fromParts>?
<fromPart part=”NCName” toVariable=”BPELVariableName”/>+
</fromParts>
</receive>
Bảng 2.4-cấu trúc XML của receive
Invoke
Để gọi hoặc thực hiện một dịch vụ web nào đó thì ta sử dụng invoke activity.
Invoke activity mô tả một dịch vụ web thực hiện ở dạng “một chiều” hoặc “yêu cầu- đáp ứng”. Các dịch vụ web đối tác đƣợc xác định thông qua PartnerLink và Operation. Để thực thi một invoke activity thì cần xác định ít nhất một biến đầu vào và có hoặc không có biến đầu ra tùy thuộc vào t ng dạng dịch vụ web mà nó gọi thực hiện (dạng “một chiều” hoặc “yêu cầu-hồi đáp”). Hình 2.2 mô tả một trường hợp sử dụng cụ thể của invoke activity,ở đây thì dịch vụ tìm kiếm tên khách hàng đƣợc gọi thực hiện:
Hình 2.3-Ví dụ về trường hợp sử dụng invoke
27
Cấu trúc XML của invoke đƣợc mô tả nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
<invoke partnerLink=”NCName” portType=”QName”?
operation=”NCName”
inputVariable=”NCName”? outputVariable=”NCName”?
standard-attributes>
standard-elements <correlations>?
<correlation set=”NCName” initiate=”yes|join|no”?
pattern=”request|response|request-response”/>+
</correlations>
<catch faultName=”QName”? faultVariable=”NCName”?
faultMessageType=”QName”? faultElement=”QName”?>*
activity </catch>
<catchAll>?
Activity </catchAll>
<compensationHandler>?
Activity
</compensationHandler>
<toParts>?
<toPart part=”NCName” fromVariable=”BPELVariableName”/>+
</toParts>
<fromParts>?
<fromPart part=”NCName” toVariable=”BPELVariableName”/>+
</fromParts>
</invoke>
Bảng 2.5-Cấu trúc Xml của invoke
Reply
Một reply activity đóng vai trò nhƣ một giá trị trả về trong một tiến trình BPEL. Nội dung thông điệp đƣợc gửi đi sẽ đƣợc dịch vụ web đối tác tiếp nhận thông qua Receive Activity ở dạng onMessage (thông điệp) hoặc onEvent (sự kiện). Một Reply Activity thì sẽ có cùng một partnerLink và operation với Receive Activity tương ứng của dịch vụ web đối tác. Để thực thi được thì Reply Activity yêu cầu phải đƣợc đặc tả cho thông điệp mà nó sẽ gửi đi. Khi tiến trình xuất hiện lỗi thì
28
Reply Activity sẽ trả về một ngoại lệ. Chúng ta có thể kiểm soát các lỗi này bằng cách thêm một Throw activity để trả về một ngoại lệ nếu xử lý trong tiến trình bị lỗi nhƣ hình 2.4:
Hình 2.4-Trường hợp sử dụng của Reply Cấu trúc xml của Reply nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13
<reply partnerLink=”NCName” portType=”QName”?
operation=”NCName”
variable=”BPELVariableName”? faultName=”QName”?
messageExchange=”NCName”?
standard-attributes>
standard-elements <correlations>?
<correlation set=”NCName” initiate=”yes|join|no”?>+
</correlations>
<toParts>?
<toPart part=”NCName” fromVariable=”BPELVariableName”/>+
<toParts>
</reply>
Bảng 2.6-Cấu trúc Xml của Reply
29
Validate
Một validate activity có nhiệm vụ kiểm tra tính hợp lệ của các biến dựa trên định nghĩa của nó có liên quan đến tài liệu XML và WSDL. Bạn có thể kiểm tra một danh sách các biến với activity này. Trong suốt quá trình hoạt động nếu có một biến nào đó đƣợc tìm thấy có chứa một giá trị không hợp lệ thì tiến trình ngay lập tức kết thúc với một ngoại lệ “invalidVariables” được ném ra. Lưu ý rằng bạn cũng có thể kiểm tra tính hợp lệ của các biến đƣợc sử dụng trong Assign Activity. Hình 2.5 mô tả một trường hợp sử dụng của Validate:
Hình 2.5-Trường hợp sử dụng của Validate Cấu trúc Xml của validate đƣợc mô tả nhƣ sau:
1 2 3 4
<validate variables=”BPELVariableName-list”
standard-attributes>
standard-elements
</validate>
Bảng 2.7-Cấu trúc Xml của Validate
Assign
Assign activity đƣợc dùng để cập nhật giá trị cho các biến chứa bên trong nó.
Assign cập nhật các biến bằng một trong những cách sau:
Copy dữ liệu t một biến khác
Khởi tạo thông qua các phương thức của XPath
30
Khởi tạo thông qua các phương thức của WS-BPEL và một số phương thức mở rộng khác.
Cấu trúc Xml của Assign đƣợc thể hiện nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11
<assign validate=”yes|no”? standard-attributes>
standard-elements
(<copy keepSrcElementName=”yes|no”?
ignoreMissingFromData=”yes|no”?>
from-spec (see below) to-spec (see below) </copy> |
<extensionAssignOperation>
...assign-element-of-other-namespace...
</extensionAssignOperation>) +
</assign>
Bảng 2.8-Cấu trúc Xml của Assign
Throw
Throw Activity đƣợc sử dụng để trả ra các lỗi trong quá trình thực thi của một tiến trình BPEL. Bạn có thể thiết lập các các link để dẫn đến Throw Activity t các Activity khác trong trường hợp xảy ra lỗi như hình 2.6:
Hình 2.6-Trường hợp sử dụng của Throw
31
Cấu trúc Xml của Throw Activity đƣợc thể hiện nhƣ sau:
1 2 3 4
<throw faultName=”QName” faultVariable=BPELVariableName”?
standard-attributes standard-elements
</throw>
Bảng 2.9-Cấu trúc Xml của Throw
Rethrow
Rethrow activity được sử dụng trong trường hợp bạn không muốn ném ra ngoại lệ và d ng tiến trình tại chính điểm gây ra lỗi mà muốn ném nó lên một cấp xử lý cao hơn. Rethrow được dùng để bắt tất cả các lỗi được ném ra t tiến trình con bên dưới bởi Throw activity.Ví dụ trong hình 2.7:
Hình 2.7-Trường hợp sử dụng của Rethrow
32
Cấu trúc Xml của Rethrow Activity đƣợc thể hiện nhƣ sau:
1 2 3
<rethrow standard-attributes standard-elements
</rethrow>
Bảng 2.10-Cấu trúc Xml của Rethrow
Exit
Exit Activity đƣợc dùng để chấm dứt ngay lập tức một tiến trình đang thực thi bất chấp mọi đều kiện đặt ra.Ví dụ một trường hợp sử dụng của Exit Activity như hình 2.8
Hình 2.8-Trường hợp sử dụng của Exit Cấu trúc Xml của Exit Activity:
1 2 3
<exit standard-attributes standard-elements
</exit>>
Bảng 2.11-Cấu trúc Xml của Exit
Wait
Wait activity cho phép d ng tiến trình trong khoản thời gian bao lâu (duration) hay là cho đến một mốc thời gian nào đó (date).
Ví dụ:
D ng trong khoản thời gian 1 giây:<wait for="'PT1S'"/>
D ng cho tới mốc thời gian 0 giời ngày 12-12-2010:<wait until=”‟2010-12- 12T12:00‟” >.
Trường hợp sử dụng của wait được thể hiện trong hình 2.9:
33
Hình 2.9-Trường hợp sử dụng của Wait Cấu trúc xml của wait nhƣ sau:
1 2 3 4
<wait (for=”duration-expr” | until=”deadline-expr”)standard- attributes>
standard-elements
</wait>
Bảng 2.12-Cấu trúc Xml của wait
Empty
Khi một tiến trình gặp xửa lý này thì sẽ “không làm gì cả”.Ví dụ nhƣ khi có một lỗi cần đƣợc bắt và ta không muốn xử lý, lúc này Empty activity sẽ đƣợc sử dụng nhƣ hình 2.10:
Hình 2.10-Trường hợp sử dụng của Empty
34
Cấu trúc xml của Empty nhƣ sau:
1 2 3
<empty standard-attributes>
standard-elements
</empty>
Bảng 2.13-Cấu trúc Xml của Empty
Compensate Scope
Là activity dùng để thụ lý lỗi. Khi có lỗi xảy ra thì activity này sẽ đƣợc dùng để xử lý lỗi trên phạm vi đƣợc chỉ ra. Nó là một trong hai loại activity thụ lý lỗi của BPEL. Ví dụ về trường hợp sử dụng của Compensate Scope như hình 2.11.
Compensate Scope đƣợc chỉnh định thụ lý lỗi trong phạm vi A.
Hình 2.11-Trường hợp sử dụng của Compensate Scope
35
Cấu trúc xml của Compensate Scope:
1 2 3
<compensateScope target=”NCName” standard-attributes>
standard-elements
</compensateScope>
Bảng 2.14-Cấu trúc Xml của Compensate Scope
Compensate
Có chức năng thụ lý lỗi trên tất cả các phạm vi có liên quan. Ví dụ sau là trường hợp sử dụng của Compensate, trong trường hợp này nó thụ lý lỗi của scope.
Hình 2.12-Trường hợp sử dụng của Compensate Cấu trúc xml:
1 2 3
<compensate standard-attributes>
standard-elements
</compensate>
Bảng 2.15-Cấu trúc Xml của Compensate
36
Flow
Flow Activity hỗ trợ thực hiện song song và đồng bộ các xử lý trong tiến trình.
Ngoài hỗ trợ xử lý song song thì flow còn cho phép đồng bộ hóa các xử lý thông qua các liên kết đồng bộ <link>. Một <link> đƣợc xác định đƣợc xác định bởi tên (name) và thể hiện sự ràng buộc giữa hai xử lý. Ví dụ một trường hợp sử dụng của Flow:
Hình 2.13-Trường hợp sử dụng của Flow Cấu trúc xml:
1 2 3 4 5 6 7
<flow atandard-attributes>
standard-elements <links>?
<link name=”ncname”>+
</links>
activity+
</flow>
Bảng 2.16-Cấu trúc Xml của Flow
RepeatUntil
Một RepeatUntil activity đƣợc sử dụng để lặp lại một xử lý nào đó cho đến khi nó sai với điều kiện đặt ra. RepeatUntil có mối liên hệ với While activity. RepeatUntil thực hiện xửa lý trước khi kiểm tra điều kiện còn while thì ngược lại
Cấu trúc xml của RepeatUntil nhƣ sau:
1 2 3 4 5 6 7
<repeatUntil standard-attributes>
standard-elements activity
<condition expressionLanguage=”anyURI”?>
bool-expr </condition>
</repeatUntil>
Bảng 2.17-Cấu trúc Xml của RepeatUntil
37
Pick
Xử lý Pick đƣợc dùng để bắt các sự kiện xảy ra trong tiến trình và thực hiện xử lý gắn liền với sự kiện đó. Nếu có nhiều sự kiện xảy ra thì xử lý sẽ ƣu tiên sƣ kiện nào xảy ra trước.
Cấu trúc Pick bao gồm một tập các nhánh có dạng Event Activity, và chỉ có một nhánh đƣợc gọi khi có sự kiện nào đó xảy ra gắn liền với nhánh đó các sự kiện khác thì xử lý Pick sẽ không quan tâm nữa, ví dụ một trường hợp sử dụng của Pick Activity:
Hình 2.14-Trường hợp sử dụng của Pick Cấu trúc xml của Pick:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<pick createInstance=”yes|no”? standard-attributes>
standard-elements
<onMessage partnerLink=”NCName”
portType=”QName”? operation=”NCName”
variable=BPELVariableName”?>+
messageExchange=”NCName”?>+
<correlations>?
<correlation set=”NCName” initiate=”yes|join|no”?>+
</correlations>
<fromParts>?
<fromPart part=”NCName” toVariable=”BPELVariableName” />+
</fromParts>
activity </onMessage>
<onAlarm>
</onAlarm>
</pick>
Bảng 2.18-Cấu trúc Xml của Pick
38
If
If là một activity dùng để điều khiển các xử lý của tiến trình. Các xử lý đƣợc điều khiển bởi một hoặc nhiều điều kiện đƣợc thiết lập và có thêm một tùy chọn với thẻ Elseif. Các điều kiện đƣợc xử lý If xem xét theo thứ tự đƣợc thiết lập trong cấu trúc của nó.
Cấu trúc xml của if nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<if standard-attributes>
standard-elements
<condition expressionlanguage=”anyURI”?>
bool-expr </condition>
activity <elseif>*
<condition expressionlanguage=”anyURI”?>
bool-expr </condition>
activity </elseif>
<else>?
activity </else>
</if>
Bảng 2.19-Cấu trúc Xml của If
Foreach
Foreach activity chứa một scope activity bên trong và thực hiện một vòng lặp các xử lý chứa bên trong theo dạng đếm. Việc lặp lại các xử lý bên trong foreach có thể đƣợc thực hiện song song hoặc tuần tự. Số lần lặp lại của foreach đƣợc thiết lập bởi biểu thức khởi tạo cho giá trị bắt đầu và giá trị kết thúc. Một thẻ startcountervalue đƣợc dùng để thiết lập giá trị khởi đầu vòng lặp và finalcountervalue để thiết lập cho giá trị kết thúc. Nếu finalcountervalue lớn hơn startcountervalue thì vòng lặp sẽ không đƣợc thực hiện. Ngoài ra trong xử lý foreach còn có thêm một tùy chọn complention condition. Điều kiện complention được sử dụng trong trường hợp xử lý
39
foreach khi ta chỉ muốn xử lý N của M nhánh trong xử lý foreach(N<M). Hình 2.15 là một trườn hợp sử dụng của foreach:
Hình 2.15-Trường hợp sử dụng của Foreach Cấu trúc xml của Foreach đƣợc thể hiện nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<forEach counterName="NCName" parallel="yes|no">
standard-attributes>
standard-elements
<startCounterValue expressionLanguage="anyURI">
</startCounterValue>
<finalCounterValue expressionLanguage="anyURI">
</finalCounterValue>
<completionCondition extension-attribute extension-element
<branches expressionLanguage="URI"?
countSuccessfulBranchesOnly="yes|no"?>
an-integer-expression </branches>
</completionCondition>
activity
</forEach>
Bảng 2.20-Cấu trúc Xml của Foreach
40
While
While activity đƣợc sử dụng để lặp đi lặp lại việc thực thi tuần tự một xử lý chứa bên trong nó. Quá trình lặp này sẽ dùng lại cho tới khi điều kiện lặp không còn thỏa.
Cấu trúc xml của while đƣợc thể hiện nhƣ sau:
1 2 3 4 5 6 7
<while standard-attributes>
<condition expressionLanguage=”anyURI”?>
bool-expr </condition>
standard-elements activity
</while>
Bảng 2.21-Cấu trúc Xml của While
Scope
Ngữ cảnh xử lý (behavior context) của mỗi xử lý đƣợc cung cấp bởi một scope activity. Một scope có thể cung cấp faulthandle, eventhandle, compensatehandle, data variable, partnerLink và correlation set. Hình 2.16 là một thể hiện của Scope:
Hình 2.16-Trường hợp sử dụng của Scope
41
Cấu trúc xml của scope nhƣ sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
<scope isolated=”yes|no”? exitOnStandardFault="yes|no"?
standard-attributes>
standard-elements <variables>?
...
</variables>
<partnerLinks>?
...
</partnerLinks>
<correlationSets>?
...
</correlationSets>
<messageExchanges>?
...
</messageExchanges>
<faultHandlers>?
...
</faultHandlers>
<compensationHandler>?
...
</compensationHandler>
<eventHandlers>?
...
</eventHandlers>
<terminationHandler>?
...
</terminationHandler>
activity
</scope>
Bảng 2.22-Cấu trúc Xml của Scope
42