symfony/scheduler
是6.3之后的一个新组件,它还没有文档,所以我希望有人知道如何让这个组件工作。我所读到的是他们的博客文章,可以be found here。
Javier将该组件描述为在其实现中几乎等同于symfony/messenger
组件,唯一的区别是计划消息需要有一个定义计划的ScheduleProvider
,以及它自己的队列名称。
我已经添加了我的时间表如下:
#[AsSchedule("default")]
class DefaultScheduleProvider implements ScheduleProviderInterface
{
public function getSchedule(): Schedule
{
$schedule = new Schedule();
$schedule->add(RecurringMessage::every("5 seconds", new TestScheduledMessage()));
return $schedule;
}
}
然后我在messenger配置中定义了我的消息队列:
framework:
messenger:
failure_transport: failed
transports:
scheduler_default: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
App\Scheduler\TestScheduledMessage: scheduler_default
然后我运行symfony console debug:scheduler
来验证是否检测到调度:
default
-------
------------------------- ------------------------------------ ---------------------------
Message Trigger Next Run
------------------------- ------------------------------------ ---------------------------
TestScheduledMessage PeriodicalTrigger: every 5 seconds 2023-08-10T15:28:30+00:00
------------------------- ------------------------------------ ---------------------------
信使认出了我的交通工具:
------------------- -------
Transport Count
------------------- -------
scheduler_default 0
------------------- -------
然后我通过symfony console messenger:consume -vv scheduler_default
设置我的worker,但我从来没有收到任何消息,它只是永远坐在那里,什么也不做。
我还需要做些什么才能让事情正常进行吗?
编辑
另外,如果它可能是有用的信息,这是我的处理程序:
#[AsMessageHandler]
final class TestMessageHandler
{
public function __invoke(TestScheduledMessage $message)
{
// do something with your message
}
}
1条答案
按热度按时间1mrurvl11#
因此,它并不完全像messenger组件,因为不能在messenger.yaml配置中定义传输。队列提供程序自动设置队列,如果队列已经存在,它什么也不做。
在我上面的代码中删除
scheduler_default
传输,然后将消息路由到另一个传输,例如默认的async
,将使其工作。范例:
由于没有文档,并且博客文章说它的配置与信使组件相同,我错误地假设您也必须配置传输。
调度器传输仍然需要它的特定工作者,就像任何常规的信使传输一样。