Symfony Scheduler 如何在任务变更后重新加载计划?
数据阿明
结论
数据库任务变更提交后,运行 php bin/console messenger:stop-workers,让 Scheduler worker 优雅退出。Supervisor 会根据 autorestart=true 启动新进程。新进程重新创建 Schedule,并读取当前启用的任务。Symfony 使用这个命令停止 Messenger workers:worker 完成当前处理后退出,再由进程管理器重新启动。Symfony Messenger 文档
操作步骤
保存任务变更并提交数据库事务后,执行:
php bin/console messenger:stop-workers
在 Supervisor 配置中,autorestart=true 会在 worker 退出后重新启动进程。新进程调用 getSchedule(),通过 allEnabled() 从数据库读取最新任务列表。Symfony Scheduler 文档说明,计划中的 recurring messages 会保存在内存中,以避免重复计算。因此,修改数据库不会自动更新正在运行的计划。Symfony Scheduler 文档
注意事项
messenger:stop-workers 会通过应用缓存通知 worker 退出,因此执行命令的 CLI 和运行中的 worker 必须能访问同一应用缓存。多主机部署时,应使用 Redis 等共享缓存适配器。Symfony 文档也提醒,跨主机运行时需要共享该缓存。Symfony Messenger 文档
你的 --time-limit=3600 会让进程最长运行一小时后退出。任务变更后无需等待这个时限,可以执行上述命令触发重启。请在数据库事务提交后再运行命令,确保新 worker 启动时读到最新数据。
备注:内容仅供参考。
