Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — Workflow

Sử dụng

Workflow chạy không đúng?

Kiểm tra theo thứ tự:

  1. Execution logs: Vào workflow → Executions → xem execution gần nhất
  2. Job status: Kiểm tra từng job — job nào rejected là nơi có lỗi
  3. Trigger condition: Xác nhận trigger đúng event và collection
  4. Node config: Kiểm tra cấu hình từng node (field mapping, condition expression)
  5. Log file: Xem logs/workflows/{workflowId}/ để biết chi tiết lỗi

Có giới hạn số workflow không?

Không có giới hạn kỹ thuật. Tuy nhiên, nhiều workflow enabled cùng lúc sẽ:

  • Tăng số event listener trên database
  • Tăng tải cho Dispatcher
  • Tốn nhiều memory cho enabled cache

Khuyến nghị: chỉ enable workflow cần thiết, disable workflow không dùng.

Workflow không kích hoạt?

Kiểm tra:

  1. Enabled? Workflow phải có enabled: true
  2. Trigger type đã đăng ký? Kiểm tra log: trigger type {type} is not implemented
  3. Event đúng? Collection Event trigger cần đúng collection và event type
  4. Dữ liệu match? Trigger có thể có filter condition — kiểm tra dữ liệu có thỏa mãn không

Workflow chạy bị lặp vô hạn?

Nguyên nhân phổ biến:

  • Node Update cập nhật cùng collection mà trigger đang lắng nghe → trigger lại workflow
  • Giải pháp: thêm Condition node kiểm tra trạng thái trước khi update, hoặc dùng field flag để tránh re-trigger

User nhận task thế nào?

Khi workflow tạo task cho user:

  1. Task được lưu vào workflowTasks + userWorkflowTasks
  2. Plugin gửi thông báo qua WebSocket: ws:sendToUser
  3. User xem task tại My Tasks → chọn Resume hoặc Cancel

Cấu hình

Làm sao thêm trigger type mới?

typescript
class MyPlugin extends Plugin {
  async load() {
    const wf = this.app.pm.get('workflow') as PluginWorkflowServer;
    wf.registerTrigger('webhook', WebhookTrigger);
  }
}

WebhookTrigger cần kế thừa class Trigger và implement các method on(), off().

Làm sao thêm instruction (node type) mới?

typescript
wf.registerInstruction('send-email', SendEmailInstruction);

SendEmailInstruction cần kế thừa class Instruction và implement method run().

Custom function là gì?

Function có thể dùng trong Calculation node:

javascript
// Dùng function genSnowflakeId đã đăng ký
return $functions.genSnowflakeId();

Plugin khác đăng ký:

typescript
wf.functions.register('myFunction', () => {
  return 'custom value';
});

Workflow versioning

Tại sao có keycurrent?

Plugin hỗ trợ versioning: nhiều phiên bản workflow cùng key, nhưng chỉ 1 phiên bản có current: true.

  • Khi enable workflow → đặt current: true
  • Phiên bản trước bị enabled: false, current: null
  • Execution logs giữ nguyên — bạn xem được lịch sử chạy của mỗi phiên bản

Tại sao cần workflowStatsversionStats?

StatsPhạm viMô tả
workflowStatsToàn bộ workflow (cùng key)Đếm tổng số lần thực thi qua tất cả phiên bản
versionStatsPhiên bản cụ thểĐếm số lần thực thi của phiên bản hiện tại

Xử lý sự cố

Lỗi "trigger type is not implemented"?

Workflow có type không khớp với trigger đã đăng ký. Nguyên nhân:

  • Plugin cung cấp trigger chưa được bật
  • Workflow được import từ nơi khác với trigger type không tồn tại

Execution stuck ở trạng thái "started"?

Nguyên nhân:

  • Node bị lỗi không bắt được (unhandled error)
  • Node manual đang chờ user duyệt nhưng user chưa thao tác
  • Dispatcher bị overload

Giải pháp:

  • Cancel execution thủ công
  • Kiểm tra log file để xem node nào bị stuck
  • Dispatcher kiểm tra queue mỗi 5 phút — chờ hoặc trigger manual: app.emit('workflow:dispatch')

Restart server có ảnh hưởng workflow đang chạy?

Khi restart:

  1. beforeStop hook tắt tất cả trigger và dọn dẹp
  2. Sau khi khởi động lại, afterStart hook load lại tất cả workflow enabled
  3. Dispatcher kiểm tra queue và tiếp tục execution đang chờ

Execution đang chạy giữa chừng sẽ được Dispatcher phát hiện và tiếp tục sau khi server sẵn sàng.