Skip to main content

Welcome to a Grasp lesson

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

Lesson 10

Sử dụng Start và End Event trong Quy trình

Recommended resources

Chào bạn,

Ở bài học trước, chúng ta đã cùng nhau cài đặt Camunda Modeler và thực hành tạo ra một quy trình nghiệp vụ đầu tiên. Bạn đã quen với các thao tác cơ bản như thêm, nối và đặt tên cho các phần tử, tạo ra một quy trình feed-hawk.bpmn với một Start Event và End Event mặc định. Đây là những sự kiện "trơn" (None Events), nghĩa là quy trình chỉ bắt đầu khi có người chủ động khởi tạo và kết thúc một cách đơn giản.

Tuy nhiên, sức mạnh thực sự của BPMN và Camunda nằm ở khả năng tự động hóa và phản ứng với các bối cảnh nghiệp vụ đa dạng. Trong bài học hôm nay, chúng ta sẽ nâng cấp kỹ năng mô hình hóa của mình bằng cách tìm hiểu cách sử dụng các loại Start Event và End Event khác nhau trong một quy trình. Bạn sẽ khám phá cách làm cho quy trình tự động bắt đầu theo lịch, hoặc được kích hoạt bởi một tin nhắn từ hệ thống khác, cũng như cách quy trình có thể tạo ra các kết quả khác nhau khi kết thúc.

Việc nắm vững các loại sự kiện này là nền tảng để bạn có thể thiết kế các quy trình tự động hóa phức tạp và thông minh hơn, một bước tiến gần hơn đến mục tiêu xây dựng các hệ thống điều phối microservices hay workflow engine của riêng mình.

1. Phân biệt các loại Sự kiện (Events)

Trước tiên, hãy làm rõ khái niệm về các loại sự kiện. Trong BPMN, một sự kiện (Event) là "một điều gì đó xảy ra" trong quá trình. Chúng ta đã biết có 3 giai đoạn chính: Start, Intermediate, và End.

Giải ngố các ký hiệu BPMN - Thinhnotes

Để củng cố lại cách nhận biết các loại sự kiện một cách trực quan, hãy đọc nhanh phần giải thích trong bài viết "Giải ngố các ký hiệu BPMN" từ Thinhnotes.

Hãy đọc đoạn ngắn bắt đầu bằng "Một điểm nữa anh em cần chú ý..." cho đến hết mục số 5. Chú ý đến cách tác giả phân biệt 3 loại sự kiện dựa vào kiểu đường viền của vòng tròn.

Như bạn vừa đọc, chúng ta có thể phân biệt các giai đoạn của sự kiện qua hình dạng:

  • Start Event: Một vòng tròn với đường viền mỏng.
  • End Event: Một vòng tròn với đường viền dày/đậm.
  • Intermediate Event: Một vòng tròn có hai đường viền.

Vậy làm thế nào để phân biệt các loại sự kiện khác nhau trong cùng một giai đoạn? Đó là nhờ vào biểu tượng (icon) bên trong vòng tròn. Trong Camunda Modeler, bạn có thể dễ dàng thay đổi loại của một sự kiện.

Camunda Modeler Event Selection Menu
Hình ảnh này cho thấy menu ngữ cảnh (context menu) khi bạn nhấp vào biểu tượng cờ lê (wrench icon) trên một sự kiện. Bạn có thể thay đổi một Start Event mặc định (None) thành Timer, Message, Signal Event và nhiều loại khác.

Bây giờ, chúng ta sẽ đi sâu vào một vài loại Start và End Event phổ biến và hữu ích nhất.


2. Khám phá các loại Start Event

Start Event xác định điều kiện để một quy trình mới được khởi tạo.

a. Timer Start Event: Khởi tạo theo lịch trình

Đây là loại sự kiện bạn sẽ dùng khi muốn một quy trình tự động chạy vào một thời điểm cụ thể hoặc lặp lại theo chu kỳ. Đối với một developer, bạn có thể hình dung nó tương tự như một cron job trong môi trường Linux hoặc một Scheduled Task trong các framework lập trình.

  • Khi nào dùng? Gửi báo cáo hàng tuần, thực hiện sao lưu dữ liệu mỗi đêm, kiểm tra trạng thái hệ thống mỗi giờ.

Thực hành trong Modeler:

  1. Tạo một sơ đồ BPMN mới.
  2. Nhấp vào Start Event có sẵn.
  3. Nhấp vào biểu tượng cờ lê (wrench icon) và chọn Timer Start Event. Biểu tượng chiếc đồng hồ sẽ xuất hiện.
  4. Với Timer Start Event được chọn, nhìn vào Properties Panel bên phải, tìm đến mục Timer Definition.
  5. Bạn sẽ thấy 3 lựa chọn chính:
    • Type: Chọn Cycle.
    • Timer Definition: Nhập một biểu thức cron. Ví dụ, để chạy quy trình vào 8 giờ sáng mỗi ngày, bạn nhập 0 0 8 * * ?.

BPMN 2.0 Symbols - A complete guide with examples.

Để xem thêm ví dụ và giải thích chi tiết về Timer Event, bạn có thể tham khảo tài liệu của Camunda.

Đọc mục "Timer". Bạn không cần đọc hết, chỉ cần xem qua các ví dụ để hiểu sự linh hoạt của Timer Event, như bắt đầu quy trình trước một chuyến đi 2 tháng, hoặc bắt đầu vào một ngày giờ cụ thể.

b. Message Start Event: Khởi tạo theo thông điệp

Loại sự kiện này cho phép một quy trình bắt đầu khi nó nhận được một thông điệp (message) cụ thể từ một hệ thống bên ngoài hoặc một quy trình khác. Đây là khái niệm cốt lõi để xây dựng các hệ thống có tính liên kết lỏng (loosely coupled) và là nền tảng cho kiến trúc microservices. Bạn có thể coi nó như một API endpoint hoặc một message consumer đang lắng nghe trên một message queue.

  • Khi nào dùng? Bắt đầu quy trình "Xử lý đơn hàng" khi nhận được message new-order-placed, hoặc khởi tạo quy trình "Tạo tài khoản người dùng" khi service Authentication gửi message user-signup-request.

Thực hành trong Modeler:

  1. Thay đổi Start Event thành Message Start Event (biểu tượng lá thư).
  2. Trong Properties Panel, tìm đến mục Message Name.
  3. Nhập một tên định danh cho message, ví dụ newOrderReceived. Tên này rất quan trọng, vì Camunda Engine sẽ dùng nó để "route" message đến đúng quy trình cần khởi tạo.

Video sau đây minh họa rất rõ cách các Message Event được dùng để điều phối giao tiếp giữa các quy trình khác nhau (ví dụ: giữa khách hàng và người pha chế).

BPMN Message Events and Message Flows Explained

Hãy xem một phần của video "BPMN Message Events and Message Flows Explained" từ Camunda để hiểu cách một quy trình của người pha chế được bắt đầu bằng một Message Start Event khi có đơn hàng mới.

Xem từ 12:56 đến 14:00. Hãy chú ý cách quy trình "Barista" không tự bắt đầu mà được kích hoạt bởi sự kiện "order comes in", vốn là một Message Start Event. Đây là ví dụ điển hình về một quy trình phản ứng (reactive process).

Một quy trình có thể có nhiều cách để bắt đầu. Bạn hoàn toàn có thể có cả Timer Start Event và Message Start Event cho cùng một quy trình.

BPMN Diagram with Different Start and End Events in Camunda Modeler
Sơ đồ này minh họa một quy trình có thể được bắt đầu hoặc bằng một bộ đếm thời gian (Timer) hoặc khi nhận được một thông điệp (Message).

3. Khám phá các loại End Event

End Event không chỉ đơn thuần là kết thúc, nó còn có thể tạo ra một kết quả cụ thể khi một luồng (path) của quy trình hoàn thành.

a. Message End Event: Kết thúc và gửi thông điệp

Đây là đối tác "gửi" (throwing) của Message Start Event "nhận" (catching). Khi một luồng xử lý đi đến sự kiện này, nó sẽ kết thúc và đồng thời gửi đi một thông điệp.

  • Khi nào dùng? Kết thúc quy trình "Phê duyệt tài liệu" bằng cách gửi message document-approved đến hệ thống lưu trữ.

Trong Modeler: Thay đổi End Event thành Message End Event. Trong Properties Panel, bạn sẽ thấy mục Implementation. Đây là nơi bạn sẽ cấu hình logic để gửi message (ví dụ: gọi một Java class). Chúng ta sẽ tìm hiểu chi tiết cách implement ở Module 6, bây giờ bạn chỉ cần biết cách mô hình hóa nó.

b. Error End Event: Kết thúc và báo lỗi nghiệp vụ

Đây là một khái niệm rất quan trọng. Error End Event không phải là một lỗi kỹ thuật (technical exception) như NullPointerException. Nó đại diện cho một lỗi nghiệp vụ đã được dự liệu trước. Khi được kích hoạt, nó sẽ dừng luồng hiện tại và "ném" ra một lỗi có tên, lỗi này có thể được "bắt" lại bởi một sự kiện khác (thường là một Error Boundary Event) ở cấp cao hơn để xử lý.

  • Khi nào dùng? Trong quy trình "Kiểm tra tín dụng", nếu điểm tín dụng của khách hàng quá thấp, quy trình con kết thúc bằng một CreditCheckFailed Error End Event. Quy trình chính sẽ bắt lỗi này và chuyển sang luồng "Từ chối đơn vay".

Trong Modeler: Thay đổi End Event thành Error End Event (biểu tượng tia sét). Trong Properties Panel, bạn cần định nghĩa Error Name hoặc Error Code, ví dụ creditFailed. Đây là "chìa khóa" để bắt đúng lỗi.

c. Terminate End Event: Chấm dứt toàn bộ quy trình

Đây là sự kiện kết thúc mạnh nhất. Không giống như None End Event chỉ kết thúc một luồng, Terminate End Event sẽ chấm dứt ngay lập tức toàn bộ process instance, bao gồm tất cả các luồng song song đang chạy.

  • Khi nào dùng? Cẩn thận khi sử dụng! Một trường hợp hợp lệ là trong một quy trình phê duyệt phức tạp, nếu người dùng chọn "Hủy đơn", bạn muốn tất cả các hoạt động (gửi email, chờ phê duyệt...) phải dừng lại ngay lập tức.

Trong Modeler: Chọn Terminate End Event (biểu tượng vòng tròn đen đặc). Không có cấu hình gì đặc biệt, nhưng hãy luôn nhớ về "sức công phá" của nó.

BPMN 2.0 Symbols - A complete guide with examples.

Tài liệu của Camunda giải thích rất chi tiết về các loại sự kiện này. Bạn có thể dùng nó như một cuốn cẩm nang để tra cứu sau này.

Bạn không cần đọc kỹ ngay bây giờ, nhưng hãy lướt qua các mục sau để biết chúng tồn tại và có thể tham khảo khi cần: Message: Mô tả cách message được dùng để giao tiếp. Error: Giải thích về lỗi nghiệp vụ. Termination: Mô tả cách nó dừng toàn bộ các tác vụ song song.


4. Thực hành: Xây dựng quy trình "Kiểm tra Sức khỏe Hệ thống"

Lý thuyết đã đủ, giờ là lúc thực hành. Hãy vận dụng kiến thức vừa học để mô hình hóa quy trình sau:

Kịch bản:
Công ty bạn muốn tự động hóa việc kiểm tra sức khỏe của một hệ thống quan trọng mỗi ngày.

  1. Quy trình phải tự động bắt đầu vào 7 giờ sáng mỗi ngày.
  2. Sau khi bắt đầu, nó thực hiện một tác vụ là "Kiểm tra sức khỏe hệ thống".
  3. Dựa vào kết quả kiểm tra, có hai khả năng:
    • Nếu hệ thống hoạt động bình thường (OK), quy trình kết thúc và gửi một thông điệp tên là system-health-ok để các hệ thống khác biết.
    • Nếu hệ thống gặp sự cố (Down), quy trình kết thúc và ném ra một lỗi nghiệp vụ tên là SYSTEM_DOWN_ERROR để kích hoạt một quy trình xử lý sự cố khác.

Nhiệm vụ của bạn:
Hãy mở Camunda Modeler và vẽ sơ đồ BPMN cho kịch bản trên.

Xem gợi ý giải pháp

Sơ đồ của bạn sẽ trông giống như sau:

  1. Start Event: Loại Timer Start Event, với cấu hình Cycle là 0 0 7 * * ?.
  2. Nối tiếp là một Task (bạn có thể dùng Service Task hoặc Task thông thường) với tên là "Kiểm tra sức khỏe hệ thống".
  3. Sau Task là một Exclusive Gateway (hình thoi có dấu X) với câu hỏi "Hệ thống OK?".
  4. Từ Gateway có hai luồng đi:
    • Luồng "Yes": Dẫn đến một End Event loại Message End Event. Cấu hình Message Name cho nó là system-health-ok.
    • Luồng "No": Dẫn đến một End Event loại Error End Event. Cấu hình Error Name cho nó là SYSTEM_DOWN_ERROR.

Tổng kết bài học

Trong bài học này, chúng ta đã đi từ các sự kiện đơn giản đến việc sử dụng các loại sự kiện có mục đích cụ thể, giúp các quy trình của bạn trở nên linh hoạt và mạnh mẽ hơn rất nhiều:

  • Bạn đã học cách sử dụng Timer Start Event để lên lịch cho các quy trình tự động.
  • Bạn đã biết cách dùng Message Start/End Events để các quy trình giao tiếp với nhau.
  • Bạn đã hiểu sự khác biệt quan trọng giữa lỗi kỹ thuật và Error End Event cho lỗi nghiệp vụ.
  • Bạn đã nhận thức được sức mạnh và sự nguy hiểm của Terminate End Event.

Việc lựa chọn đúng loại sự kiện là một kỹ năng thiết yếu để mô hình hóa chính xác logic nghiệp vụ.


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

Chúng ta đã biết cách bắt đầu và kết thúc một quy trình một cách thông minh. Nhưng công việc thực sự ở giữa các sự kiện đó là gì? Thường thì đó là công việc của con người. Trong bài học tiếp theo, chúng ta sẽ tập trung vào một trong những yếu tố quan trọng nhất của BPMN: "Thêm User Task và cấu hình các thuộc tính cơ bản". Bạn sẽ học cách gán công việc cho một người dùng cụ thể và định nghĩa các thuộc tính cần thiết cho họ làm việc.