Skip to main content

Welcome to a Grasp lesson

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

Lesson 37

Sử dụng Intermediate Timer Event để tạo độ trễ

Recommended resources

Chào bạn,

Ở bài học trước, chúng ta đã khám phá cách sử dụng Timer Start Event để tự động khởi tạo một quy trình theo lịch trình định sẵn. Đó là một công cụ mạnh mẽ để tự động hóa các công việc lặp đi lặp lại từ điểm xuất phát.

Trong bài học hôm nay, chúng ta sẽ tiếp tục với chủ đề thời gian nhưng từ một góc độ khác. Thay vì bắt đầu một quy trình, chúng ta sẽ tìm cách tạo ra một sự trì hoãn bên trong một quy trình đang chạy. Đây là một yêu cầu rất phổ biến trong thực tế, ví dụ như "chờ 24 giờ trước khi gửi email nhắc nhở" hoặc "tạm dừng quy trình trong 30 phút để chờ hệ thống bên ngoài xử lý".

Mục tiêu của bài học này là: Sử dụng Intermediate Timer Event để tạo độ trễ trong một quy trình. Chúng ta sẽ học cách mô hình hóa, cấu hình và ứng dụng loại sự kiện này để tạm dừng luồng thực thi của quy trình một cách có kiểm soát.


1. Intermediate Timer Catch Event là gì?

Intermediate Timer Catch Event (Sự kiện Timer Bắt giữ Trung gian) hoạt động giống như một chiếc đồng hồ báo thức đặt giữa quy trình của bạn. Khi một process instance (luồng thực thi) đi đến sự kiện này, nó sẽ dừng lại và chờ. Process engine sẽ lên lịch cho một "báo thức". Khi báo thức reo (tức là khi bộ đếm thời gian kết thúc), luồng thực thi sẽ tiếp tục đi đến phần tử tiếp theo trong quy trình.

Điểm khác biệt chính cần ghi nhớ:

  • Timer Start Event: Kích hoạt để tạo ra một process instance mới.
  • Intermediate Timer Catch Event: Tạm dừng một process instance đang tồn tại.

Để hiểu rõ hơn về khái niệm và các trường-hợp-sử-dụng, hãy xem video sau từ Camunda.

BPMN Intermediate Events and How to Use Them In Camunda

Video này giải thích chi tiết về Intermediate Timer Event, sự khác biệt so với Timer Start Event và các tình huống ứng dụng thực tế.

Xem từ 03:19 đến 05:22. Hãy chú ý đến ví dụ về việc đặt vé và chờ một khoảng thời gian trước khi xử lý. Đây là một ví dụ điển hình cho việc tạo độ trễ có chủ đích trong một quy trình nghiệp vụ.

Như video đã giải thích, sự kiện này có thể được cấu hình để chờ một khoảng thời gian cố định (ví dụ: 1 giờ) hoặc chờ cho đến một thời điểm được tính toán động dựa trên các biến của quy trình (ví dụ: 1 tháng trước ngày diễn ra sự kiện).



2. Mô hình hóa và Cấu hình

Việc cấu hình một Intermediate Timer Event rất giống với Timer Start Event mà bạn đã học. Bạn sẽ sử dụng cùng một tiêu chuẩn ISO 8601 để định nghĩa thời gian.

Các loại định nghĩa thời gian

Giống như trước đây, bạn có ba lựa chọn chính trong Properties Panel:

  1. Date: Chờ cho đến một ngày giờ cụ thể. Ví dụ: 2024-12-31T23:59:00+07:00[Asia/Ho_Chi_Minh].
  2. Duration: Chờ trong một khoảng thời gian nhất định. Đây là lựa chọn phổ biến nhất để tạo độ trễ. Ví dụ: PT30M (chờ 30 phút), P2D (chờ 2 ngày).
  3. Cycle: Lặp lại. Ít được sử dụng cho Intermediate Catch Event, trừ khi bạn muốn tạo ra một chuỗi các hành động lặp đi lặp lại trong cùng một process instance.

Để tạo độ trễ, chúng ta sẽ tập trung vào Duration.

Định dạng Duration (ISO 8601)

Định dạng này bắt đầu bằng P (Period) và có thể bao gồm ngày, giờ, phút, giây. T được dùng để phân tách phần ngày và phần thời gian.

The ISO 8601 Time Duration Pattern
Sơ đồ giải thích các thành phần của định dạng ISO 8601 cho một khoảng thời gian: P (Period), Y (Year), M (Month), D (Day), T (Time), H (Hour), M (Minute), S (Second).

Một vài ví dụ phổ biến:

  • PT10S: 10 giây
  • PT15M: 15 phút
  • PT1H: 1 giờ
  • P1D: 1 ngày
  • P1DT12H: 1 ngày và 12 giờ

Các bước thực hiện trong Camunda Modeler

Tài liệu sau đây sẽ hướng dẫn bạn từng bước để thêm và cấu hình một Intermediate Timer Event.

Timer Event

Tài liệu này cung cấp hướng dẫn chi tiết về cách mô hình hóa một Time Intermediate Catch Event. Hãy đọc để nắm vững các bước thực hiện trên giao diện Camunda Modeler.

Đọc toàn bộ mục '4. Time Intermediate Catch Event modeling'. Hãy tập trung vào các bước: kéo thả phần tử, chuyển đổi loại sự kiện (Change type) và cấu hình các thuộc tính Timer Definition Type và Timer Definition trong Properties Panel.

Đây là hình ảnh minh họa kết quả cuối cùng sau khi cấu hình:

Camunda BPMN Intermediate Timer Event Configuration
Giao diện Properties Panel cho một Intermediate Timer Event. Ở đây, Timer Definition Type được đặt là 'Duration' và giá trị Timer Definition là 'PT23H', nghĩa là quy trình sẽ tạm dừng trong 23 giờ tại điểm này.


3. Thực hành: Quy trình Gửi Thông báo Trì hoãn

Bây giờ, hãy áp dụng kiến thức vào một ví dụ thực tế. Chúng ta sẽ xây dựng một quy trình gửi thông báo cho người dùng, sau đó chờ 15 giây và gửi một thông báo khác.

Kịch bản:

  1. Quy trình bắt đầu, gửi ngay một email xác nhận "Đã nhận yêu cầu".
  2. Quy trình tạm dừng trong 15 giây.
  3. Sau 15 giây, quy trình tiếp tục và gửi email thứ hai "Yêu cầu của bạn đã được xử lý".

Bước 1: Mô hình hóa quy trình

  1. Trong Camunda Modeler, tạo một quy trình BPMN mới.
  2. Kéo thả các phần tử để tạo luồng sau:
    • Start Event
    • Service Task (Đặt tên: "Send Confirmation Email")
    • Intermediate Timer Catch Event (Đặt tên: "Wait 15 Seconds")
    • Service Task (Đặt tên: "Send Processing-Complete Email")
    • End Event

Bước 2: Cấu hình các phần tử

  1. Cấu hình Timer Event:

    • Chọn Intermediate Timer Event "Wait 15 Seconds".
    • Trong Properties Panel:
      • Timer Definition Type: Chọn Duration.
      • Timer Definition: Nhập PT15S.
  2. Cấu hình Service Tasks:

    • Chọn Service Task "Send Confirmation Email". Trong Properties Panel, đặt Implementation là Java Class và Java Class là com.example.camunda.delegates.ConfirmationDelegate.
    • Chọn Service Task "Send Processing-Complete Email". Đặt Implementation là Java Class và Java Class là com.example.camunda.delegates.CompletionDelegate.

Bước 3: Viết mã Java Delegate

Tạo hai lớp Java Delegate đơn giản để ghi log ra console, mô phỏng việc gửi email.

ConfirmationDelegate.java:

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.LocalTime;

@Component("ConfirmationDelegate")
public class ConfirmationDelegate implements JavaDelegate {

    private final Logger LOGGER = LoggerFactory.getLogger(ConfirmationDelegate.class);

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        LOGGER.info(">>> Gửi email xác nhận lúc: {}. Process ID: {}", 
            LocalTime.now(), execution.getProcessInstanceId());
    }
}

CompletionDelegate.java:

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.LocalTime;

@Component("CompletionDelegate")
public class CompletionDelegate implements JavaDelegate {

    private final Logger LOGGER = LoggerFactory.getLogger(CompletionDelegate.class);

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        LOGGER.info("<<< Gửi email xử lý hoàn tất lúc: {}. Process ID: {}", 
            LocalTime.now(), execution.getProcessInstanceId());
    }
}

Bước 4: Deploy và Quan sát

  1. Deploy quy trình vào ứng dụng Spring Boot của bạn.
  2. Khởi chạy ứng dụng.
  3. Sử dụng Camunda Tasklist hoặc REST API để bắt đầu một process instance mới của quy trình này.
  4. Quan sát Console:
    • Bạn sẽ thấy ngay lập tức log ">>> Gửi email xác nhận...".
    • Sau đó sẽ có một khoảng lặng.
    • Khoảng 15 giây sau, bạn sẽ thấy log "<<< Gửi email xử lý hoàn tất...".
  5. Quan sát trong Camunda Cockpit:
    • Mở Cockpit và tìm process instance vừa tạo.
    • Bạn sẽ thấy luồng thực thi (token) đang dừng lại ở sự kiện "Wait 15 Seconds". Biểu tượng timer sẽ có một viền màu xanh lá cây cho biết nó đang hoạt động.
    • Sau 15 giây, hãy làm mới (refresh) trang. Bạn sẽ thấy token đã di chuyển qua timer, thực thi tác vụ cuối cùng và quy trình đã hoàn tất.

Việc quan sát trực quan trong Cockpit sẽ giúp bạn củng cố vững chắc cách hoạt động của Intermediate Timer Event.



Tổng kết

Qua bài học này, bạn đã nắm được một kỹ thuật quan trọng để điều khiển luồng thời gian trong quy trình nghiệp vụ.

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

  • Intermediate Timer Catch Event được sử dụng để tạo ra một điểm dừng (pause) trong một quy trình đang chạy.
  • Nó được cấu hình bằng các loại định nghĩa thời gian như Date, Duration, và Cycle, trong đó Duration là phổ biến nhất để tạo độ trễ.
  • Luôn sử dụng định dạng ISO 8601 (ví dụ: PT15S, P1D) để xác định khoảng thời gian.
  • Bạn có thể theo dõi trạng thái của timer đang chờ trực tiếp trong Camunda Cockpit.

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

Chúng ta đã dùng timer để bắt đầu và tạm dừng toàn bộ luồng quy trình. Nhưng nếu chúng ta chỉ muốn đặt một giới hạn thời gian cho một tác vụ cụ thể thì sao? Ví dụ, một nhân viên phải hoàn thành một "User Task" trong vòng 4 giờ, nếu không hệ thống sẽ tự động leo thang (escalate). Đây là lúc Timer Boundary Event phát huy tác dụng. Trong bài học tiếp theo, chúng ta sẽ tìm hiểu cách "gắn" một bộ đếm thời gian vào một hoạt động để xử lý các kịch bản timeout.