Chuyển <sequence> thành đồ thị có hướng

Một phần của tài liệu (LUẬN văn THẠC sĩ) vấn đề bế tắc (deadlock) trong quy trình được hiện thực bằng BPEL (Trang 42 - 46)

Trường hợp, ràng buộc điều kiện đối với nhiều hơn hai thành phần <link> cùng đi vào một thành phần nào đó, BPEL quy định sử dụng điều kiện joinCondition, đó là một biểu thức Boolean, chỉ khi nào kết quả của biểu thức trả về giá trị true, thì thành phần hoạt động đi vào mới chuyển sang trạng thái thực thi, ngược lại, thành phần đó sẽ không bao giờ được thực hiện. Có nhiều lý do làm cho giá trị của biểu thức

joinCondition bằng false, có thể luồng xử lý dữ liệu, luồng thực thi của các

<link> gây ra, tuy nhiên, biểu thức joinCondition của nhiều hơn hai thành phần

phần <if>, thì giá trị joinCondition như vậy luôn bằng false. Như vậy, đối với các <link> đi ra từ các nhánh của cùng một thành phần <if>, biểu thức

joinCondition thể hiện phép toán logic AND như $link1 AND $link2 AND…AND

$linkn, thì luôn gây ra lỗi bế tắc chương trình BPEL mà không có cảnh báo trong lập trình bằng công cụ. Tại bước DOM Tree, chương trình ứng dụng phải xét phép toán biểu thức logic của thành phần <joinCondition> thể hiện trong thành phần

<targets>, và các thành phần <target> trong bao đóng của tập <targets>,

các thành phần <source> có thuộc tính linkName có thuộc trong các nhánh của cùng một thành phần <if>.

3.2. Xây dựng công cụ phát hiện và cảnh báo bế tắc

Dựa trên ý tưởng giải pháp ở mục 3.1, chương trình phát hiện và cảnh báo bế tắc thiết kế và xây dựng các module xử lý dựa trên ngôn ngữ Java, bao gồm các phần chính như sau :

 Module tách mã nguồn <flow> và chuyển về đồ thị có hướng với các nút và các cung: trong module này, thực thi các bước từ phân tích file mã nguồn .bpel đầu vào, sử dụng DOM Parser dạng tài liệu XML, thành DOM Tree. Duyệt cây dạng DOM, xác định các nút/ đỉnh, các cung cùng phép điều kiện joinCondition thành đồ thị có hướng với các ràng buộc. Module này phải xây dựng được các lớp đặc trưng cho thao tác chuyển từ các thành phần hoạt động dạng XML về thành các đỉnh của đồ thị có hướng dựa trên đặc trưng của các thành phần hoạt động cơ sở và các thành phần hoạt động có cấu trúc <if>, <sequence>. Các đỉnh là các thành phần hoạt động nằm trong các nhánh của cùng thành phần <if> (các thành phần <source>) nối với một thành phần đích theo các cung (các thành phần <link> cùng thuộc tính

linkName), phải phát hiện được biểu thức điều kiện joinCondition gây bế tắc.

 Module thực hiện: Từ đồ thị trên, module này giải bài toán tìm chu trình trong đồ thị có hướng và bài toán định dạng phát hiện pháp toán joinCondition có phải là phép logic AND của các giá trị cung và các đỉnh đi ra của các cung đó có nằm trong đường đi xuất phát từ một đỉnh if trong đồ thị đã xây dựng. Để dễ dàng giải quyết bài toán trong module này, ở module đầu tiên trên, cần quy chuẩn hoặc đánh dấu các đỉnh, các cung của đồ thị có hướng, phân biệt được, các đỉnh thể hiện thành phần <if>, thành phần <sequence>, các đỉnh thể hiện các activities nằm trong bao đóng của

<sequence>, các cung là thể hiện của các <link>, và phát hiện được điều kiện

joinCondition phép toán AND.

 Module kiểm tra và kiểm thử : Module này, sẽ kiểm định công cụ phát hiện và cảnh báo bế tắc đã xây dựng ở hai module trên. Đầu vào là các tài liệu BPEL thể hiện

bài toán 1, bài toán 2, bài toán 3 trong mục 2.2. Kết quả xử lý, chương trình phải phát hiện được chu trình hay vấn đề bế tắc và thông báo đối với người dùng cuối.

Phần này sẽ đi sâu, mô tả hướng xây dựng và các thuật toán sử dụng trong bài toán. Trong giới hạn luận văn này, sẽ bỏ qua sự phực tạp của bài toán, nghĩa là không xét các trường hợp <scope>, điều khiển lỗi, các thành phần lặp <while>,

<repeatUtil>, <for>… hay là các trường hợp lồng nhau.

 Module tách mã nguồn <flow> và chuyển về đồ thị có hướng với các nút và các cung.

Bước 1: Xây dựng đồ thị có hướng G = (V,E) với V là tập các đỉnh và E là tập các cạnh (cung).

- Bước 1.1: Mã nguồn <flow> đã tách từ <process> phải chuyển thành đồ thị có hướng G định nghĩa trên.

- Bước 1.2: Chuyển activities trong <flow> thành các đỉnh, hay tập V của đồ thị G. Bỏ qua các thuộc tính của các activity, tập đỉnh V chứa các thành phần hoạt động activities được định nghĩa trong BPEL như các <if>, <sequence>, các thành phần cơ sở <assign>, <empty>, <invoke>….

Ví dụ: Mã nguồn biểu diễn cho thành phần <if> như sau:

<bpel:if name="If">

<bpel:condition…></bpel:condition>

<bpel:assign validate="no" name="Assign"> <bpel:copy> <bpel:from> <bpel:query>…</bpel:query> </bpel:from> <bpel:to></bpel:to> </bpel:copy> <bpel:sources> <bpel:source linkName="link1"> </bpel:source> </bpel:sources> </bpel:assign> <bpel:else> <bpel:assign>

<bpel:copy> <bpel:from>…</bpel:from> <bpel:to></bpel:to> </bpel:copy> <bpel:sources> <bpel:source linkName="link2"> </bpel:source> </bpel:sources> </bpel:assign> </bpel:else> <bpel:targets> <bpel:target linkName="link3"> </bpel:target> </bpel:targets> </bpel:if>

Các đỉnh sẽ là If (<bpel:if name="If">), Assign (<bpel:assign validate="no" name="Assign">), Assign1 (<bpel:assign validate="no" name="Assign1">) bỏ qua các thành phần thuộc tính của <if> như <Condition> hay các thuộc tính đi kèm của <assign> là <copy>, <from>, <to>….

 Như vậy ta có, đối với mã nguồn BPEL cho bài toán 1 ở mục 2.2, tập đỉnh sẽ là V = { If, Assign, Assign1, Assign2} với Assign2 (<bpel:assign validate="no" name="Assign2">).

Chuyển <flow> thành các cạnh của đồ thị có hướng G. Nếu <flow> không sử dụng thành phần <link> thì các thành phần hoạt động activities nằm trong bao đóng của

<flow> sẽ thực thi song song (không phải tuần tự mã nguồn) và nếu sử dụng các

thành phần <link> thì sẽ thực thi phụ thuộc giữa thành phần <source> và

<target> của <link> trong <flow>. Trong trường hợp bài toán 1 định nghĩa và

sử dụng các thành phần <link> để điều khiển phụ thuộc, vì thế tập <link> sẽ là các cạnh của đồ thị có hướng G. Thành phần <source> của link được bao đóng bởi thành phần activity nào thì thành phần activity ấy sẽ là một đỉnh đi ra của một cạnh thuộc G. Còn thành phần <target> của link được bao đóng bởi thành phần activity nào thì thành phần activity đó là một đỉnh đi vào của một cạnh thuộc G. Như vậy, từ các link sử dụng ở mã nguồn của bài toán 1 ví dụ, các cạnh được định nghĩa là cung link1 = (Assign, Assign2), cung link2 = (Assign1, Assign2), cung link3 = (Assign2, If). Bên cạnh đó, trong phần đặt vấn đề, giả sử coi như luồng thực thi của thành phần

toán 1, sẽ được các cung định nghĩa là cung if1 = (If, Assign) và cung if2 = (If, Assign1). Bài toán 3, tương tự như bài toán 1.

 Như vậy, tập E các cung bao gồm:

E = {(If, Assign), (If, Assign1), (Assign, Assign2), (Assign1, Assign2), (Assign2, If)}

Biểu diễn đồ thị G = (V, E) được định nghĩa ở trên như hình dưới:

Một phần của tài liệu (LUẬN văn THẠC sĩ) vấn đề bế tắc (deadlock) trong quy trình được hiện thực bằng BPEL (Trang 42 - 46)

Tải bản đầy đủ (PDF)

(51 trang)