Bỏ qua, đến nội dung

Tham chiếu API — Async Task Manager

Tổng quan Resource

ResourceMô tảQuyền
asyncTasksQuản lý tác vụ nềnNgười dùng đã đăng nhập (loggedIn)

User chỉ thấy và điều khiển tasks do chính mình tạo.

Lấy danh sách tasks

typescript
const response = await agent.resource('asyncTasks').list({
  sort: ['-createdAt'],
  filter: { status: 'running' },  // tuỳ chọn: lọc theo trạng thái
});
// response.body.data = [{ id, taskType, status, progress, createdAt, ... }]

Lấy chi tiết task

typescript
const response = await agent.resource('asyncTasks').get({
  filterByTargetKey: taskId,
});
const { status, progress, resultFile, errorMessage } = response.body.data;

Dừng task đang chạy

typescript
await agent.resource('asyncTasks').stop({
  filterByTargetKey: taskId,
});
// Task chuyển sang status: 'cancelled'

Tải file kết quả

typescript
// Chỉ khả dụng khi status = 'completed' và task có resultFile
const file = await agent.resource('asyncTasks').fetchFile({
  filterByTargetKey: taskId,
});
// Response: stream file download

Task Object

TrườngKiểuMô tả
idbigintID tác vụ
taskTypestringLoại task: export-xlsx, import-csv, bulk-update, custom...
statusstringpending, running, completed, failed, cancelled
progressfloatTiến trình 0–100 (%)
paramsjsonTham số đầu vào của task
resultFilestringĐường dẫn file kết quả (nếu có)
errorMessagetextThông báo lỗi (nếu failed)
userIdbigintUser đã tạo task
createdAttimestampThời gian tạo
updatedAttimestampThời gian cập nhật gần nhất

Dành cho Plugin Developer

Đăng ký Task Type

Plugin khác đăng ký task type thông qua AsyncTaskManager:

typescript
import { Plugin } from '@digiforce-nc/server';

class MyExportPlugin extends Plugin {
  async load() {
    const taskManager = this.app.pm.get('async-task-manager');
    
    taskManager.registerTaskType('my-custom-export', {
      handler: async (task, params) => {
        const { collectionName, filter } = params;
        const records = await this.db.getRepository(collectionName).find({ filter });
        
        for (let i = 0; i < records.length; i++) {
          // Xử lý từng record
          await processRecord(records[i]);
          
          // Cập nhật tiến trình
          const progress = Math.round((i / records.length) * 100);
          await task.updateProgress(progress);
        }
        
        return { resultFile: '/path/to/result.xlsx' };
      },
    });
  }
}

Tạo task từ code

typescript
const taskManager = this.app.pm.get('async-task-manager');
const task = await taskManager.createTask({
  type: 'my-custom-export',
  params: {
    collectionName: 'orders',
    filter: { status: 'completed' },
  },
  userId: ctx.state.currentUser.id,
});
// task.id = ID của task vừa tạo

Task Type Registry

Lifecycle của một task

Thành phần Client

Thành phầnMô tảSử dụng
AsyncTaskManagerProviderContext provider quản lý task statesWrap toàn bộ app
TaskProgressBarComponent hiển thị thanh tiến trìnhTrong task list
TaskListDanh sách tasks đang chạy/hoàn thànhPanel popup
TaskOriginRegistryRegistry để plugin client đăng ký UI cho task typePlugin developer

Giới hạn kỹ thuật

Tham sốGiá trịGhi chú
Tối đa tasks đồng thời5 (cấu hình được)Tăng nếu server đủ tài nguyên
File kết quả tồn tại24h (cấu hình được)Tự động xoá sau đó
Task timeout mặc định10 phútTăng cho tác vụ lớn
Retry khi lỗi3 lầnChỉ cho transient errors