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