定时任务
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)
- 失败重试机制
- 可扩展的处理器接口