排程任務
Doggy 內建基於自訂 TaskScheduler + Symfony Messenger 的排程任務系統,支援分散式執行和多種任務類型。
概述
排程任務系統位於 src/Service/Task/:
src/Service/Task/
├── TaskHandlerInterface.php # 任务处理器接口
├── TaskHandlerLocator.php # 处理器定位器
└── TaskScheduler.php # 调度器相關實體在 src/Entity/System/:
| 實體 | 說明 |
|---|---|
Task.php | 任務定義(Cron、處理器、參數) |
TaskLog.php | 任務執行日誌 |
建立排程任務
1. 實作任務處理器
php
namespace App\Task;
use App\Service\Task\TaskHandlerInterface;
class ActivateAccountByHireDateTask implements TaskHandlerInterface
{
public function handle(array $params = []): void
{
// 执行业务逻辑
}
}既有任務範例:src/Task/ActivateAccountByHireDateTask.php
2. 註冊任務
透過資料庫或命令註冊:
bash
php bin/console app:run-scheduler排程執行
TaskScheduler 實作機制:
- 從資料庫讀取 Task 設定
- 解析 Cron 運算式
- 透過
TaskHandlerLocator定位處理器 - 使用 Symfony Messenger 非同步執行(
RunTaskMessage+RunTaskMessageHandler) - 執行結果記錄至
TaskLog
訊息架構
TaskScheduler → 发送 RunTaskMessage
↓
Messenger (Doctrine Transport)
↓
RunTaskMessageHandler → TaskHandlerInterface::handle()
↓
TaskLog 记录执行结果管理介面
入口:App\Controller\Admin\TaskController
範本:templates/admin/task/index.html.twig
- 任務清單檢視
- 執行日誌檢視
- 手動觸發執行
特性
- Cron 運算式排程
- 非同步執行(Messenger 訊息佇列)
- 執行狀態追蹤(TaskLog)
- 失敗重試機制
- 可擴充的處理器介面