Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 20

Xây dựng Exclusive Gateway với biến quy trình

Recommended resources

Chào bạn,

Trong module trước, chúng ta đã tìm hiểu sâu về cách quản lý dữ liệu trong quy trình. Bạn đã học cách làm việc với các biến đơn giản và cả các đối tượng Java phức tạp, cũng như cách truy cập các thuộc tính của chúng bằng Expression Language (ví dụ: ${orderDetails.totalAmount}). Đây là nền tảng cực kỳ quan trọng cho bài học hôm nay.

Bây giờ, chúng ta sẽ bắt đầu Module 5, tập trung vào việc điều khiển luồng quy trình. Thay vì một chuỗi các tác vụ tuần tự, quy trình trong thực tế thường có các nhánh, các vòng lặp và các đường đi song song. Chúng ta sẽ khám phá các công cụ mà BPMN cung cấp để mô hình hóa những logic phức tạp này.

Mục tiêu của bài học hôm nay là giúp bạn nắm vững cách implement Exclusive Gateway (XOR) với các điều kiện rẽ nhánh sử dụng biến quy trình. Đây là một trong những thành phần điều khiển luồng cơ bản và được sử dụng nhiều nhất, cho phép quy trình của bạn "đưa ra quyết định".

1. Exclusive Gateway (XOR) là gì?

Trong lập trình, bạn thường xuyên sử dụng cấu trúc if-else if-else để thực thi các đoạn code khác nhau dựa trên một điều kiện. Exclusive Gateway, hay còn gọi là XOR Gateway, chính là phiên bản BPMN của cấu trúc đó.

Nó được biểu diễn bằng một hình thoi và hoạt động như một điểm quyết định trong quy trình của bạn: nó sẽ định tuyến luồng công việc đi theo chính xác một trong số các đường đi (sequence flow) đầu ra của nó.

BPMN Exclusive Gateway with Conditional Branching
Một ví dụ về Exclusive Gateway (hình thoi) trong Camunda Modeler. Quy trình sẽ đi theo nhánh 'OK' hoặc 'not OK' dựa trên giá trị của biến `is_OK`.

Để có cái nhìn tổng quan đầu tiên, hãy xem một đoạn video ngắn giới thiệu về các loại gateway, bắt đầu với Exclusive Gateway.

The Only BPMN Tutorial You Will Ever Need To Watch (For Beginners)

Video này từ kênh Stefano - The Agile Business Analyst sẽ giới thiệu nhanh về các loại gateway, trong đó có Exclusive Gateway (được gọi là 'either or' gateway).

Hãy xem từ 02:50 đến 03:26 để hiểu khái niệm cơ bản về gateway và vai trò của nó trong việc ra quyết định.


2. Cách hoạt động: Conditions và Default Flow

Vậy làm thế nào Exclusive Gateway biết được nên chọn đường đi nào? Câu trả lời nằm ở các điều kiện (conditions) mà bạn đặt trên các sequence flow đi ra từ nó.

  • Conditions: Mỗi sequence flow (ngoại trừ một, chúng ta sẽ nói đến sau) phải có một điều kiện được định nghĩa. Điều kiện này là một biểu thức logic (boolean expression) sử dụng Expression Language (JUEL) để truy cập các biến quy trình.
  • Evaluation: Khi quy trình chạy đến gateway, Camunda Engine sẽ đánh giá các điều kiện này theo thứ tự. Nó sẽ chọn đường đi đầu tiên có điều kiện trả về true.
  • Default Flow: Điều gì xảy ra nếu không có điều kiện nào là true? Để tránh quy trình bị "mắc kẹt", bạn nên chỉ định một Default Flow. Đây là đường đi sẽ được chọn nếu tất cả các điều kiện khác đều là false. Một gateway chỉ có thể có một Default Flow.

Để hiểu rõ hơn về các khái niệm này, hãy đọc tài liệu chính thức của Camunda.

Exclusive gateway - Camunda Docs

Tài liệu này giải thích chi tiết về cách Exclusive Gateway hoạt động, bao gồm conditionExpression và default flow. Mặc dù tài liệu này dành cho Camunda 8 và sử dụng ngôn ngữ FEEL, các khái niệm cốt lõi về gateway là hoàn toàn giống với Camunda 7 mà chúng ta đang sử dụng.

Hãy đọc hai phần đầu tiên: Exclusive gateway: Chú ý đến cách nó đánh giá các điều kiện và vai trò của default flow. Đặc biệt, hãy lưu ý thông tin rằng một incident (lỗi) sẽ được tạo ra nếu không có điều kiện nào được thỏa mãn và không có default flow. Conditions: Xem qua các ví dụ về biểu thức điều kiện. Hãy hình dung cách bạn sẽ viết các biểu thức tương tự bằng cú pháp JUEL ${...} mà chúng ta đã học.

Quan trọng: Nếu không có điều kiện nào đúng và bạn không thiết lập Default Flow, Camunda sẽ tạo ra một Incident. Đây là một trạng thái lỗi mà quy trình không thể tự động tiếp tục, đòi hỏi sự can thiệp thủ công. Do đó, việc xác định một Default Flow là một best practice rất quan trọng.


3. Thực hành: Xây dựng quy trình phê duyệt đơn hàng

Bây giờ là phần thú vị nhất: áp dụng kiến thức vào thực tế. Chúng ta sẽ cải tiến quy trình xử lý đơn hàng từ bài học trước. Yêu cầu mới là:

  • Nếu tổng giá trị đơn hàng (totalAmount) lớn hơn 10,000,000 VND, đơn hàng cần được chuyển cho quản lý phê duyệt.
  • Nếu không, đơn hàng được tự động chấp thuận và đi tiếp.

Hãy xem video hướng dẫn chi tiết cách thêm và cấu hình một XOR Gateway trong môi trường Spring Boot, tương tự như project của chúng ta.

Camunda Platform 7 Tutorial: Adding an XOR Gateway and Running Java in a Spring Boot Project

Video chính thức từ Camunda sẽ hướng dẫn bạn từng bước để thêm một XOR Gateway, cấu hình các điều kiện rẽ nhánh và sau đó chạy thử để xem nó hoạt động.

Hãy xem các phần sau: Adding the gateway (00:27 - 01:32): Xem cách thêm gateway vào sơ đồ, tạo ra hai nhánh và sau đó hợp nhất chúng lại. Configuring conditions (01:41 - 02:49): Đây là phần quan trọng nhất. Chú ý cách người trình bày chọn từng sequence flow và đặt Condition Type là Expression, sau đó viết biểu thức điều kiện. Cú pháp #{...} mà họ dùng tương đương với ${...} mà chúng ta đã quen thuộc. Demonstration (08:18 - 09:29): Xem cách quy trình hoạt động trong thực tế khi chạy với các giá trị biến khác nhau.

Dựa trên video và kiến thức đã học, hãy cùng thực hiện các bước sau trong project của bạn:

Bước 1: Cập nhật mô hình BPMN

  1. Mở file BPMN của quy trình xử lý đơn hàng trong Camunda Modeler.
  2. Sau User Task đầu tiên ("Nhập thông tin đơn hàng"), thêm một Exclusive Gateway. Bạn có thể đặt tên cho nó, ví dụ: "Kiểm tra giá trị đơn hàng?".
  3. Từ gateway này, kéo ra hai sequence flow:
    • Nhánh 1: Kéo đến một User Task mới. Đặt tên cho task này là "Quản lý phê duyệt đơn hàng".
    • Nhánh 2: Kéo đến tác vụ tiếp theo trong quy trình của bạn (ví dụ: "Xử lý kết quả" hoặc End Event).
  4. Thêm một Exclusive Gateway thứ hai để hợp nhất (merge) luồng từ "Quản lý phê duyệt đơn hàng" và nhánh 2 lại với nhau trước khi đi đến bước tiếp theo. Việc này giúp sơ đồ của bạn rõ ràng và có cấu trúc hơn.

Sơ đồ của bạn lúc này sẽ trông tương tự như thế này:

BPMN Diagram: Exclusive Gateway with Conditional Branching
Sơ đồ minh họa một quy trình có rẽ nhánh. Quy trình của bạn sẽ có cấu trúc tương tự, với điều kiện dựa trên `orderDetails.totalAmount`.

Bước 2: Cấu hình Conditions

Đây là lúc chúng ta sử dụng biến quy trình orderDetails từ bài học trước.

  1. Cấu hình cho nhánh "Cần phê duyệt":

    • Chọn sequence flow đi từ gateway đầu tiên đến User Task "Quản lý phê duyệt đơn hàng".
    • Trong Properties Panel, đi đến tab Condition.
    • Đặt Condition Type là Expression.
    • Trong ô Expression, nhập vào: ${orderDetails.totalAmount > 10000000}.
    • Để sơ đồ dễ đọc hơn, bạn có thể đặt tên cho sequence flow này là > 10M.
  2. Cấu hình cho nhánh "Tự động chấp thuận" (Default Flow):

    • Chọn sequence flow còn lại.
    • Trong Properties Panel, thay vì vào tab Condition, hãy tìm và chọn nó làm Default Flow. Modeler sẽ đánh dấu một gạch chéo nhỏ trên sequence flow này.
    • Đặt tên cho nó là <= 10M.

Bước 3: Deploy và kiểm tra

  1. Lưu lại file BPMN của bạn.
  2. Build và chạy lại ứng dụng Spring Boot để deploy phiên bản mới của quy trình.
  3. Sử dụng Postman hoặc Camunda Tasklist để khởi tạo quy trình:
    • Test case 1: Khởi tạo một process instance với totalAmount là 5000000. Sau khi hoàn thành task đầu tiên, hãy vào Cockpit để xem. Bạn sẽ thấy quy trình đi theo đường Default Flow và không có task "Quản lý phê duyệt đơn hàng" nào được tạo.
    • Test case 2: Khởi tạo một process instance khác với totalAmount là 15000000. Lần này, sau khi hoàn thành task đầu tiên, một task mới "Quản lý phê duyệt đơn hàng" sẽ xuất hiện trong Tasklist.

4. Tổng kết

Qua bài học này, bạn đã học được cách sử dụng một trong những thành phần quan trọng nhất để điều khiển logic trong BPMN.

Những điểm chính cần nhớ:

  • Exclusive Gateway (XOR) được dùng để tạo ra các điểm quyết định, tương tự như câu lệnh if-else trong code.
  • Nó chỉ cho phép một đường đi duy nhất được thực thi.
  • Quyết định được đưa ra dựa trên các biểu thức điều kiện (Expression) đặt trên các sequence flow, sử dụng các biến quy trình.
  • Luôn luôn xác định một Default Flow để xử lý các trường hợp còn lại và tránh quy trình bị lỗi (tạo ra incident).

Xem trước bài học tiếp theo

Chúng ta đã học cách để quy trình lựa chọn hoặc làm việc này, hoặc làm việc kia. Nhưng trong nhiều trường hợp, chúng ta muốn thực hiện nhiều công việc cùng một lúc. Ví dụ, sau khi khách hàng đặt hàng, hệ thống cần đồng thời gửi email xác nhận cho khách hàng VÀ thông báo cho kho để chuẩn bị hàng.

Trong bài học tiếp theo, chúng ta sẽ tìm hiểu về Parallel Gateway (AND), một công cụ cho phép bạn chia luồng quy trình ra nhiều nhánh chạy song song.