3. Hướng nghiên cứu của đề tài
2.2.1. Các thành phần tác vụ trong BPEL
Một tiến trình BPEL được thể hiện qua các tác vụ, các tác vụ 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 ngôn ngữ WS-BPEL 2.0 các tác vụ được chia làm ba nhóm cơ bản như sau:
Tác vụ cơ bản: Là các tác vụ đơn thể, nó không thể chứa được bất kỳ các tác vụ nào khác bên trong nó nữa.
Tác vụ cấu trúc: Là các tác vụ có cấu trúc, nó có thể chứa được các tác vụ khác bên trong nó.
Tác vụ xử lý lỗi: Các tác vụ 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 tác vụ khác nhau.
Bảng sau mô tả chi tiết về các tác vụ trong ngôn ngữ WS-BPEL 2.0:
Tên tác vụ Các trƣờng hợp sử dụng
Các tác vụ cơ bản
Empty
Là một tác vụ đặc biệt, không làm gì hết khi được gọi. Tác vụ này được dùng khi cần có một tác vụ nhưng không thật sự cần một hành động nào xảy ra.
Invoke Gọi một dịch vụ Web để thực hiện một tác vụ nào đó
Receive Nhận một thông điệp từ một dịch vụ ngoài. Thông thường đây là tác vụ bắt đầu một tiến trình mới
Reply Là một tác vụ dạng dẫn xuất
Opaque Activity Là một tác vụ 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…)
Tên tác vụ Các trƣờng hợp sử dụng Các tác vụ điều khiển và có cấu trúc
If/Else Định nghĩa cấu trúc điều kiện
Pick
Định 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…)
Flow Xử lý song song và điều khiển phụ thuộc.
While Lặp lại một tiến trình con nào đó trong process ở dạng while RepeatUntil Lặp lại một tiến trình con nào đó trong tiến trình ở dạng
Repeat … Until
Wait Dừng tiến trình trong một khoảng 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 tác vụ
Scope Dùng để chia nhỏ tiến trình thành các tác vụ có cácnhiệm vụ liên quan với nhau (khi tiến trình trở nên phức tạp).
Các tác vụ 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à tác vụ dùng để thụ lý lỗi. Khi có lỗi xảy ra thì tác vụ 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ư tác vụ 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
Sau đây là mô tả chi tiết và các trƣờng hợp sử dụng của từng tác vụ:
Tác vụ nhận - Receive
Khi một tiến trình BPEL cần nhận một thông điệp thì tác vụ receive sẽ được sử dụng. Tác vụ Receive 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ụ ngoài mà nó cần phải gọi thông qua PartnerLinkvà Operation. Để thực thi được thì tác vụ receive 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 tác vụ receive được thể hiện như sau.
Hình 2.5: Cấu trúc XML của receive
Hình 2.5 mô tả khai báo tác vụ receive bao gồm liên kết ngoài (partnerLink= ‖NCName‖, portType=‖QName‖, operation=‖NCName‖, các tham số này được ứng dụng khách sử dụng và gửi thông điệp đến. Biến BPEL VariableName được sử dụng để lưu giá trị đầu vào từ thông điệp.
Tác vụ gọi dịch vụ Web - Invoke
Để gọi hoặc thực hiện một dịch vụ Web nào đó thì ta sử dụng tác vụ invoke. Tác vụ Invoke 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 tác vụ Invoke 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 - đáp ứng‖).
Hình 2.6: Ví dụ về trường hợp sử dụng invoke
Hình 2.6 mô tả một trường hợp sử dụng cụ thể của tác vụ invoke trong một chức năng tìm thông tin khách hàng, chức năng này gọi dịch vụ Web: tìm kiếm tên khách hàng (InvokeLookupCustomerName):
Cấu trúc XML của invoke được mô tả như sau:
Hình 2.7: Cấu trúc XML của invoke
Trong hình 2.7, một tác vụ invoke được khai báo để gọi dịch vụ ngoài có partnerLink là ―NCName‖ và operation là ―NCName‖. Tác vụ này sử dụng biến đầu vào ―NCName‖ và trả kết quả về cho biến ―NCFullName‖.
Tác vụ nhận - Reply
Một tác vụ nhận (Reply) đó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 tác vụ Receive ở dạng onMessage (thông điệp) hoặc onEvent (sự kiện). Một tác vụ Reply thì sẽ có cùng một partnerLink và operation với tác vụ Receive tương ứng của dịch vụ Web đối tác. Để thực thi được, tác vụ Reply 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ì tác vụ Reply 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 tác vụ Throw để trả về một ngoại lệ nếu xử lý trong tiến trình bị lỗi như hình13:
Hình 2.8 Trường hợp sử dụng của Reply
Cấu trúc XML của tác vụ Reply như sau:
Tác vụ reply trong hình 2.9 có cùng partnerLink và operation với tác vụ receive tương ứng với nó. Tác vụ này dùng biến BPEL VariableName để lưu kết quả trả về từ những tác vụ trước đó của tiến trình.
Tác vụ kiểm tra tính hợp lệ - Validate
Một tác vụ Validate 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. Có thể kiểm tra một danh sách các biến với tác vụ 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 đưa ra. Lưu ý rằng cũng có thể kiểm tra tính hợp lệ của các biến được sử dụng trong tác vụ Assign. Hình 2.10 mô tả một trường hợp sử dụng của Validate được đặt giữa tác vụ Assign và Reply để kiểm tra tính hợp lệ của các biến trước khi trả về kết quả cuối cùng:
Hình 2.10: Trường hợp sử dụng của Validate
Tác vụ gán - Assign
Tác vụ Assign đượ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 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:
Hình 2.11 Cấu trúc XML của Assign
Tác vụ Assign bao gồm một hoặc nhiều thẻ <copy> để thực hiện nhiều thao tác gán các biến. Một thẻ <copy> được định nghĩa gồm 2 phần <from> - nguồn và <to> - đích, dùng để sao chép biến đích từ biến nguồn. Thẻ <copy> không chỉ được sử dụng với các biến mà còn dùng để sao chép một phần tử của một biến phức hợp hoặc sử dụng biểu thức thông qua ngôn ngữ XPATH.
Tác vụ xử lý lỗi- Throw
Tác vụ Throw đượ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. Có thể thiết lập các các link để dẫn đến tác vụ Throw từ các tác vụ khác trong trường hợp xảy ra lỗi như hình 2.12: Nếu như có bất cứ ngoại lệ nào sinh ra ở một trong các tác vụ bên trái, thì nó sẽ được bắt bởi tiến trình ―EventHanders‖ và trả về các ngoại lệ thông qua tác vụ Throw ở bên phải.
Tác vụ xử lý lỗi bên ngoài - ReThrow
Tác vụ Rethrow được sử dụng trong trường hợp không muốn đưa 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 tác vụ Throw. Ví dụ trong hình 2.13 mô tả trường hợp sử dụng của Rethrow được dùng để bắt lỗi được ném ra từ tác vụ Throw ở bên trái.
Hình 2.13: Trường hợp sử dụng của ReThrow
Tác vụ thoát tiến trình - Exit
Tác vụ Exit được dùng để chấp 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.
Tác vụ dừng tiến trình - Wait
Tác vụ Wait cho phép dừng tiến trình trong khoảng 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ảng thời gian 1 giây: <wait for="'PT1S'"/> Dừng cho tới mốc thời gian 0 giờ ngày 12-12-2011: <wait until=‖’2011-12-12T12:00’‖/>.
Tác vụ rỗng - Empty
Khi một tiến trình gặp xửa lý này thì sẽ ―không làm gì cả‖. Tác vụ thụ lý lỗi trong phạm vi - Compensate Scope
Là tác vụ dùng để thụ lý lỗi. Khi có lỗi xảy ra thì tác vụ 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 tác vụ thụ lý lỗi của BPEL.
Tác vụ thụ lý lỗi toàn tiến trình - Compensate
Có chức năng thụ lý lỗi trên tất cả các phạm vi có liên quan. Tác vụ thực hiện song song - Flow
Tác vụ Flow 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 bởi tên (name) và thể hiện sự ràng buộc giữa hai xử lý. Ví dụ cấu trúc XML của tác vụ Flow như sau:
Hình 2.14: Cấu trúc XML của Flow
Trong hình 2.14 mô tả cấu trúc của tác vụ Flow với liên kết ―timesheetEntriesApproval‖, dùng để nối giữa 2 thẻ <sources> và <target>.
Tác vụ lặp Repeat Until
Một tác vụ RepeatUntil đượ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. Repeat Until có mối liên hệ với tác vụ while. Repeat Until thực hiện xử 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 repeat Until mô tả trong hình 2.15 thể hiện việc gọi dịch vụ ―increaseIterationCounter‖ cho đến khi biến $iterations >3.
Tác vụ chọn - 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 xử lý Pick:
Hình 2.16: Trường hợp sử dụng của Pick
Tác vụ If và else if
If là một tác vụ dùng để điều khiển 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ẻ Else if.
Hình 2.17 Cấu trúc XML của If
Hình 2.17 mô tả cấu trúc của tác vụ If với các nhánh điều kiện: nếu điểm của nhân viên lớn hơn 10 sẽ thực hiện tác vụ invoke gọi dịch vụ ―calculateSurcharge‖.
Nếu không sẽ gọi dịch vụ ―sendNoSurchargeInformation‖. Tác vụ If phù hợp với bài toán có nhiều điều kiện dữ liệu tương ứng với nhiều hành động khác nhau.
Tác vụ xử lý song song và điều khiển phụ thuộc
Tác vụ Flow bao gồm một tập các hoạt động xử lý đồng thời và đồng bộ bên trong nó, vì thế nó chỉ hoàn thành khi tất cả các tác vụ bên trong thẻ <Flow> hoàn thành. Mặc định, các hoạt động bên trong thẻ <Flow> sẽ xử lý song song, tuy nhiên có thể dùng thẻ <link> bên trong <Flow> để tạo sự liên kết giữa các hoạt động.
Hình 2.18: Cấu trúc XML của Flow
Hình 2.18 ví dụ về tác vụ flow bao gồm hai tác vụ <invoke> ở bên trong nó. Hai tác vụ này sẽ hoạt động đồng thời. Tác vụ <invoke> transferMoney sẽ thực hiện sau khi tác vụ Flow kết thúc.
Tác vụ lặp Foreach
Tác vụ Foreach chứa một tác vụ Scope 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ý foreach khi ta chỉ muốn xử lý N của M nhánh trong xử lý foreach (N<M). Hình 2.19 là một trường hợp sử dụng của foreach:
Hình 2.20 Cấu trúc XML của Foreach
Tác vụ lặp While
Tác vụ While đượ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 mãn. Cấu trúc XML của While được thể hiện như hình 2.21, trong đó điều kiện <condition> được xác định bằng một biểu thức Boolean, nếu điều kiện thỏa mãn thì thực hiện tác hành động bên trong vòng lặp While:
Hình 2.21 Cấu trúc XML của While
Tác vụ định nghĩa phạm vi - Scope
Ngữ cảnh xử lý (behavior context) của mỗi xử lý được cung cấp bởi một tác vụ scope. Một scope có thể cung cấp fault handle, event handle, compensate handle, data variable, partnerLink và correlation set. Hình 2.22 là một thể hiện của scope bao gồm 4 tác vụ ngang hàng ―Assign‖, ―Reply‖, ―Invoke‖. Trong scope có thể có các scope khác lồng trong nó.
Hình 2.22 Trường hợp sử dụng của Scope 2.2.2 . BPEL với chương trình dịch Java
Java được khởi đầu bởi James Gosling và đồng nghiệp ở Sun Microsystems năm 1991. Ban đầu ngôn ngữ này được gọi là Oak, họ dự định ngôn ngữ đó thay cho C++, nhưng các tính năng giống Objective C. Không nên lẫn lộn Java với JavaScript, hai ngôn ngữ đó chỉ giống tên và loại cú pháp như C. Công ty Sun Microsystems đang giữ bản quyền và phát triển Java thường xuyên. Tháng 04/2011, công ty Sun Microsystems tiếp tục cho ra bản JDK 1.6.24 [3].
Java được tạo ra với tiêu chí "Viết (code) một lần, thực thi khắp nơi" ("Write Once, Run Anywhere" (WORA)). Chương trình phần mềm viết bằng Java có thể chạy trên mọi nền tảng (platform) khác nhau thông qua một môi trường thực thi với điều kiện có môi trường thực thi thích hợp hỗ trợ nền tảng đó. Môi trường thực thi của Sun Microsystems hiện hỗ trợ Sun Solaris, Linux, Mac OS, FreeBSD và Windows. Ngoài ra, một số công ty, tổ chức cũng như cá nhân khác cũng phát triển môi trường thực thi Java cho những hệ điều hành khác như BEA, IBM, HP... . Trong đó đáng nói đến nhất là IBM Java Platform hỗ trợ Windows, Linux, AIX & z/OS.
Java được sử dụng chủ yếu trên môi trường NetBeans và Oracle. Sau khi Oracle mua lại công ty Sun Microsystems năm 2009-2010.