Chào bạn,
Trong module trước, chúng ta đã hoàn thành một chủ đề nâng cao và rất quan trọng: xử lý lỗi. Bạn đã học cách phân biệt và xử lý cả lỗi kỹ thuật (technical errors) thông qua cơ chế retry và incident, lẫn lỗi nghiệp vụ (BPMN errors) bằng cách chuyển hướng luồng quy trình một cách tường minh. Những kỹ năng này rất cần thiết để xây dựng các quy trình mạnh mẽ và linh hoạt.
Hôm nay, chúng ta sẽ bắt đầu một module mới: Module 8: Xử lý Thời gian và Giao tiếp với Events. Trong khi các quy trình chúng ta xây dựng đến nay chủ yếu được khởi tạo thủ công, thế giới thực đòi hỏi nhiều hơn thế. Rất nhiều quy trình nghiệp vụ cần được kích hoạt tự động dựa trên yếu tố thời gian.
Bài học này sẽ tập trung vào mục tiêu đầu tiên của module: Sử dụng Timer Start Event để khởi tạo quy trình theo lịch trình. Bạn sẽ học cách thiết kế và cấu hình một quy trình để nó tự động bắt đầu vào một thời điểm cụ thể, sau một khoảng thời gian, hoặc lặp lại theo một chu kỳ định sẵn. Đây là nền tảng cho các tác vụ tự động hóa như chạy báo cáo hàng ngày, xử lý dữ liệu theo lô vào cuối tháng, hoặc gửi email nhắc nhở định kỳ.
1. Timer Start Event là gì?
Khác với Start Event thông thường mà chúng ta đã sử dụng (cần một hành động thủ công để bắt đầu), Timer Start Event là một loại sự kiện khởi đầu đặc biệt, được kích hoạt bởi một bộ đếm thời gian do process engine quản lý.
Khi bạn deploy một quy trình có chứa Timer Start Event, Camunda engine sẽ đọc cấu hình của nó và lên một lịch trình (schedule). Khi thời gian định sẵn tới, engine sẽ tự động tạo một thực thể quy trình mới (new process instance) mà không cần bất kỳ sự can thiệp nào.
Để có một cái nhìn tổng quan, hãy xem video ngắn sau đây.
BPMN Intermediate Events and How to Use Them In Camunda
Video này từ kênh Camunda sẽ giới thiệu nhanh về Timer Start Event và các trường hợp sử dụng phổ biến của nó.
Xem đoạn từ 02:25 đến 03:19. Hãy chú ý đến ví dụ về việc xử lý hàng loạt (batch processing) vào cuối ngày - đây là một ứng dụng kinh điển của Timer Start Event.
Như video đã đề cập, đây là một công cụ cực kỳ hữu ích cho các tác vụ lặp đi lặp lại theo lịch. Bây giờ, hãy tìm hiểu cách mô hình hóa và cấu hình nó.
2. Mô hình hóa và Cấu hình Timer Start Event
Việc tạo và cấu hình một Timer Start Event trong Camunda Modeler khá đơn giản và trực quan.
Bước 1: Chuyển đổi Start Event
Đầu tiên, bạn bắt đầu với một Start Event thông thường, sau đó chuyển đổi nó sang loại Timer.

Bạn chỉ cần chọn Start Event, nhấp vào biểu tượng cờ lê, và chọn "Timer Start Event". Biểu tượng của sự kiện sẽ thay đổi thành hình đồng hồ.
Bước 2: Tìm hiểu các loại định nghĩa Timer
Sau khi có Timer Start Event, bạn cần cho nó biết khi nào cần kích hoạt. Trong bảng thuộc tính (Properties Panel) ở bên phải, bạn sẽ thấy mục Timer Definition. Camunda hỗ trợ ba loại định nghĩa chính, dựa trên tiêu chuẩn ISO 8601.
Tài liệu chính thức của Camunda giải thích rất rõ về các loại timer này. Hãy đọc để nắm vững các khái niệm cốt lõi.
Đọc các phần sau trong tài liệu: Timer start events: Hiểu cách timer được lên lịch khi deploy. Timers: Nắm được ba loại định nghĩa: date, duration, và cycle. Time date: Xem định dạng cho một thời điểm cụ thể (ví dụ: 2024-12-31T23:59:00Z). Time duration: Xem định dạng cho một khoảng thời gian (ví dụ: PT10M cho 10 phút). Time cycle: Xem định dạng cho một chu kỳ lặp lại (ví dụ: R/P1D cho việc lặp lại mỗi ngày).
Hãy tóm tắt lại những điểm quan trọng nhất cho một developer:
-
Time Date: Một thời điểm cụ thể.
- Định dạng:
YYYY-MM-DDTHH:mm:ssZ(Z là múi giờ UTC). - Ví dụ:
2025-01-01T00:00:00Z- Bắt đầu vào đúng nửa đêm ngày 1/1/2025 (giờ UTC). - Sử dụng: Kích hoạt một lần vào một ngày giờ chính xác.
- Định dạng:
-
Time Duration: Một khoảng thời gian kể từ lúc quy trình được deploy.
- Định dạng:
PTnHnMnS(Period, Time, n Hours, n Minutes, n Seconds). - Ví dụ:
PT5M- Bắt đầu sau 5 phút kể từ khi deploy. - Sử dụng: Hữu ích để kích hoạt một tác vụ trì hoãn một lần. Ít phổ biến hơn cho Start Event.
- Định dạng:
-
Time Cycle: Một chu kỳ lặp lại. Đây là loại mạnh mẽ và được sử dụng nhiều nhất.
- Định dạng:
R[n]/[start_time]/P...RhoặcR/: Lặp lại vô hạn.R5/: Lặp lại 5 lần.P...: Khoảng thời gian giữa các lần lặp (theo định dạng Time Duration).
- Ví dụ:
R/PT1M: Lặp lại vô hạn, mỗi phút một lần. Rất hữu ích để kiểm thử!R/P1D: Lặp lại vô hạn, mỗi ngày một lần.
- Cron Expressions: Camunda cũng hỗ trợ Cron, một định dạng rất quen thuộc với các developer.
- Ví dụ:
0 15 10 ? * *- Chạy vào lúc 10:15 sáng mỗi ngày. Đây là cách rất linh hoạt để định nghĩa các lịch trình phức tạp (ví dụ: "vào 9 giờ sáng mỗi thứ Hai").
- Ví dụ:
- Định dạng:
Bước 3: Cấu hình trong Properties Panel
Bây giờ hãy áp dụng kiến thức trên vào Modeler.

Để xem trực tiếp cách cấu hình, video sau sẽ minh họa các bước thiết lập một Time Cycle.
BPMN Intermediate Events and How to Use Them In Camunda
Video này sẽ trình diễn cách điền giá trị cho định nghĩa Timer Cycle trong Properties Panel.
Xem đoạn từ 05:22 đến 07:26. Chú ý cách người trình bày giải thích cú pháp ISO 8601 cho một chu kỳ, ví dụ như R/PT12H để lặp lại mỗi 12 giờ. Logic này hoàn toàn áp dụng được cho Timer Start Event.
3. Ví dụ Thực hành: Quy trình Gửi Báo cáo Hàng ngày
Hãy cùng nhau xây dựng một quy trình đơn giản để củng cố kiến thức.
Kịch bản: Chúng ta cần một quy trình tự động chạy vào lúc 8 giờ sáng mỗi ngày để tạo và gửi một báo cáo tổng kết. Để đơn giản hóa, chúng ta sẽ chỉ ghi log ra console.
Bước 1: Mô hình hóa quy trình
- Trong Camunda Modeler, tạo một quy trình mới.
- Chuyển Start Event thành Timer Start Event.
- Nối nó với một Service Task có tên "Generate Daily Report".
- Nối Service Task với một End Event.
Bước 2: Cấu hình Timer
- Chọn Timer Start Event.
- Trong Properties Panel:
- Timer Definition Type: Chọn
Cycle. - Timer Definition: Để dễ dàng kiểm thử, hãy nhập
R/PT1M. Điều này sẽ làm quy trình khởi động mỗi phút một lần.- Lưu ý thực tế: Khi deploy lên môi trường production, bạn sẽ đổi giá trị này thành một biểu thức Cron như
0 0 8 * * ?để chạy vào 8 giờ sáng hàng ngày.
- Lưu ý thực tế: Khi deploy lên môi trường production, bạn sẽ đổi giá trị này thành một biểu thức Cron như
- Timer Definition Type: Chọn
Bước 3: Cấu hình Service Task
- Chọn Service Task "Generate Daily Report".
- Trong Properties Panel, dưới mục Implementation:
- Type: Chọn
Java Class. - Java Class: Nhập tên lớp delegate của bạn, ví dụ:
com.example.camunda.delegates.ReportGeneratorDelegate.
- Type: Chọn
Bước 4: Viết mã Java Delegate
Tạo một lớp Java delegate đơn giản để mô phỏng việc tạo báo cáo.
package com.example.camunda.delegates;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component("ReportGeneratorDelegate")
public class ReportGeneratorDelegate implements JavaDelegate {
private final static Logger LOGGER = LoggerFactory.getLogger(ReportGeneratorDelegate.class);
@Override
public void execute(DelegateExecution execution) throws Exception {
LOGGER.info("==============================================");
LOGGER.info("Bắt đầu tạo báo cáo hàng ngày lúc: {}", LocalDateTime.now());
LOGGER.info("Process Instance ID: {}", execution.getProcessInstanceId());
// ... logic tạo báo cáo thực tế sẽ ở đây ...
Thread.sleep(2000); // Giả lập công việc
LOGGER.info("Tạo báo cáo thành công!");
LOGGER.info("==============================================");
}
}
Bước 5: Deploy và Quan sát
- Deploy quy trình của bạn từ Modeler hoặc bằng cách đóng gói trong ứng dụng Spring Boot.
- Khởi chạy ứng dụng.
- Quan sát Console/Logs: Bạn sẽ thấy thông điệp từ
ReportGeneratorDelegateđược in ra mỗi phút. - Quan sát trong Camunda Cockpit:
- Truy cập Cockpit.
- Chọn định nghĩa quy trình của bạn.
- Bạn sẽ thấy một danh sách các process instance mới được tạo ra liên tục, mỗi phút một instance.
Để hình dung hiệu ứng này, video sau cho thấy một timer lặp lại đang hoạt động. Mặc dù nó là một Boundary Event, hiệu ứng "kích hoạt lặp lại" là tương tự.
Camunda Platform 7 Tutorial: Running Timer Events, Catching BPMN Error Events in Spring Boot Project
Video này minh họa một timer lặp lại mỗi phút đang kích hoạt một tác vụ. Trong trường hợp của chúng ta, thay vì một tác vụ mới trong cùng một instance, bạn sẽ thấy một process instance hoàn toàn mới được tạo ra trong Cockpit.
Xem đoạn từ 02:53 đến 05:25. Hãy tưởng tượng rằng mỗi lần một "lá thư" mới được tạo ra trong video, đối với quy trình của chúng ta, đó là một process instance mới xuất hiện trong danh sách của Cockpit.
Tổng kết
Trong bài học này, bạn đã học được cách tự động hóa việc khởi chạy quy trình, một khả năng cốt lõi trong BPM.
Những điểm chính cần ghi nhớ:
- Timer Start Event dùng để khởi tạo quy trình theo lịch trình mà không cần can thiệp thủ công.
- Việc cấu hình được thực hiện qua Timer Definition với ba loại chính: Date (thời điểm cụ thể), Duration (khoảng thời gian), và Cycle (chu kỳ lặp lại).
- Time Cycle là loại linh hoạt nhất, hỗ trợ cả định dạng lặp lại của ISO 8601 và Cron expressions.
- Khi phát triển và kiểm thử, hãy sử dụng chu kỳ ngắn (ví dụ:
R/PT1M) để dễ dàng quan sát kết quả.
Xem trước bài học tiếp theo
Chúng ta đã biết cách khởi động quy trình bằng timer. Nhưng điều gì sẽ xảy ra nếu chúng ta cần tạo một sự trì hoãn bên trong một quy trình đang chạy? Ví dụ: chờ 24 giờ sau khi gửi email cho khách hàng trước khi thực hiện hành động tiếp theo. Bài học kế tiếp, "Sử dụng Intermediate Timer Event để tạo độ trễ trong một quy trình", sẽ giải quyết chính xác vấn đề này.