Symfony调度器异常:scheduler_default接收器不存在,未检测到调度
Symfony调度器接收器不存在+未识别调度任务排查解决
问题现象
执行命令 php bin/console messenger:consume -vv scheduler_default 时触发报错:
In ConsumeMessagesCommand.php line 168: [Symfony\Component\Console\Exception\RuntimeException] The receiver "scheduler_default" does not exist.
执行 php bin/console debug:scheduler 显示无调度任务:
Scheduler ========= [ERROR] No schedules found.
已执行操作
已按照官方流程创建调度器类,实现ScheduleProviderInterface接口并添加#[AsSchedule('default')]属性,但调度器仍未被系统识别。
相关代码与配置
调度器类代码(src/Scheduler/Schedule.php)
// src/Scheduler/Schedule.php namespace App\Scheduler; use Symfony\Component\Scheduler\RecurringMessage; use Symfony\Component\Scheduler\Schedule; use Symfony\Component\Scheduler\ScheduleProviderInterface; use App\Message\Foo; #[AsSchedule('default')] class DefaultScheduleProvider implements ScheduleProviderInterface { public function getSchedule(): Schedule { $schedule = new Schedule(); $schedule->add(RecurringMessage::every('2 days', new Foo())); return $schedule; } }
Messenger配置文件(packages/messenger.yaml)
framework: messenger: # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. # failure_transport: failed transports: # https://symfony.com/doc/current/messenger.html#transport-configuration # async: '%env(MESSENGER_TRANSPORT_DSN)%' # failed: 'doctrine://default?queue_name=failed' # sync: 'sync://' routing: # Route your messages to the transports # 'App\Message\YourMessage': async
排查解决步骤
- 补全属性导入:代码中未导入
AsSchedule属性,导致注解不生效。需在调度器类顶部添加:use Symfony\Component\Scheduler\Attribute\AsSchedule; - 确认Scheduler组件已安装:执行以下命令确保组件存在:
composer require symfony/scheduler - 验证服务注册状态:执行命令检查调度器类是否被Symfony自动注册为服务:
若未找到php bin/console debug:container | grep ScheduleProviderDefaultScheduleProvider,需确认类的命名空间与文件路径匹配,或手动在services.yaml中配置服务。 - 清除缓存:执行缓存清除命令,确保新配置和类被加载:
php bin/console cache:clear - 配置Messenger传输(可选):若需异步执行任务,需在
messenger.yaml中启用传输并配置路由:- 取消
transports下的async或sync注释,设置对应DSN(如async: 'doctrine://default?queue_name=async') - 在
routing中添加消息路由:'App\Message\Foo': async
- 取消
- 重新验证调度器:完成上述操作后,再次执行
php bin/console debug:scheduler,若显示存在调度任务,即可执行php bin/console messenger:consume -vv scheduler_default启动消费进程。
内容的提问来源于stack exchange,提问作者Himanshu Lahare
相关产品推荐
相关产品推荐

