Giao diện
Câu hỏi thường gặp (FAQ) — Async Task Manager
Sử dụng
Task bị treo ở trạng thái "running" quá lâu?
Task có thể bị treo do nhiều nguyên nhân. Xử lý theo thứ tự:
- Đợi timeout: Mặc định 10 phút — task sẽ tự động chuyển sang
failed - Huỷ thủ công: Nhấn nút Cancel trong giao diện task list
- Kiểm tra log: Xem log server để xác định nguyên nhân (lỗi database, disk full, memory...)
- Restart server: Trường hợp cuối cùng — task sẽ chuyển sang
failedsau restart
TIP
Nếu task thường xuyên bị treo, có thể do:
- Dữ liệu quá lớn → tăng task timeout
- Database chậm → tối ưu query, thêm index
- Disk full → dọn dẹp dung lượng
Tải file kết quả nhưng link hết hạn?
File kết quả tự động xoá sau 24 giờ (mặc định). Giải pháp:
- Tải file ngay sau khi task hoàn tất
- Nếu cần giữ lâu hơn, điều chỉnh cấu hình
Cleanup after - Chạy lại task nếu file đã bị xoá
Có thể chạy nhiều task cùng lúc không?
Có. Mặc định tối đa 5 tasks đồng thời. Tasks vượt giới hạn sẽ xếp hàng chờ ở trạng thái pending.
| Số tasks | Hành vi |
|---|---|
| ≤ 5 | Chạy ngay |
| > 5 | Xếp hàng chờ (FIFO) |
| Sau khi task hoàn tất | Task tiếp theo trong hàng đợi được chạy |
Tăng giới hạn nếu server đủ tài nguyên (CPU, memory, disk I/O).
Làm sao biết task nào đang chạy?
- Giao diện: Nhấn biểu tượng task indicator trên toolbar → danh sách tasks hiện ra
- API: Gọi
asyncTasks:listvới filter{ status: 'running' } - Database: Truy vấn bảng
asyncTasks— nhưng nên dùng API thay vì query trực tiếp
Lỗi thường gặp
Task export thất bại với dữ liệu lớn?
| Nguyên nhân | Giải pháp |
|---|---|
| Task timeout (10 phút mặc định) | Tăng cấu hình timeout |
| Disk full | Kiểm tra dung lượng disk, xoá file cũ |
| Memory không đủ | Chia nhỏ dữ liệu (export theo phần/filter) |
| Database query chậm | Thêm index cho collection, tối ưu filter |
WARNING
Export dữ liệu lớn (> 100,000 bản ghi) nên:
- Chạy ngoài giờ cao điểm
- Sử dụng filter để chia nhỏ
- Đảm bảo disk có ít nhất 2x dung lượng file kết quả dự kiến
Task bị mất sau khi restart server?
- Tasks đang chạy trong memory sẽ bị mất khi server restart
- Tasks đã lưu vào database (status
pending) vẫn còn nhưng không tự chạy lại - Giải pháp: Sử dụng Redis làm task queue — đảm bảo bền vững giữa các lần restart
# Cấu hình Redis cho task queue
REDIS_URL=redis://localhost:6379Progress bar không cập nhật?
Có ba nguyên nhân phổ biến:
- Task không hỗ trợ báo cáo tiến trình: Một số task chỉ báo 0% → 100% — không có cập nhật giữa chừng
- Polling interval: Client poll mỗi vài giây — có thể có độ trễ hiển thị
- SSE connection: Nếu dùng Server-Sent Events, kiểm tra connection không bị proxy/firewall chặn
Nhiều user cùng tạo task, có xung đột không?
Không. Mỗi task chạy độc lập. Tuy nhiên:
- Nhiều task export cùng lúc sẽ tốn tài nguyên (CPU, disk I/O)
- Giới hạn concurrent tasks áp dụng toàn server (không per-user)
- Nếu nhiều user cùng export dữ liệu lớn, cân nhắc tăng timeout và giảm concurrent limit
Dành cho Developer
Plugin tôi viết muốn dùng async task, bắt đầu từ đâu?
- Đảm bảo
plugin-async-task-managerlà dependency - Trong method
load(), đăng ký task type (xem Tham chiếu API) - Implement handler function với
updateProgress()để báo tiến trình - (Tuỳ chọn) Đăng ký UI component cho task type qua
TaskOriginRegistryở client
Retry logic hoạt động thế nào?
- Retry mặc định 3 lần cho transient errors (network timeout, temporary DB lock)
- Persistent errors (lỗi logic, data invalid) không retry
- Giữa các lần retry có delay tăng dần (exponential backoff)