symfony 计划程序未发送任何消息

xfyts7mz  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(165)

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
    }
}
1mrurvl1

1mrurvl11#

因此,它并不完全像messenger组件,因为不能在messenger.yaml配置中定义传输。队列提供程序自动设置队列,如果队列已经存在,它什么也不做。
在我上面的代码中删除scheduler_default传输,然后将消息路由到另一个传输,例如默认的async,将使其工作。
范例:

framework:
    messenger:
        async: '%env(MESSENGER_TRANSPORT_DSN)%'
        failure_transport: failed
        routing:
            App\Scheduler\TestScheduledMessage: async

由于没有文档,并且博客文章说它的配置与信使组件相同,我错误地假设您也必须配置传输。
调度器传输仍然需要它的特定工作者,就像任何常规的信使传输一样。

相关问题