symfony/scheduler是从6.3开始的一个新组件,它还没有文档,所以我希望有人知道如何让这个组件工作.我所读到的都是他们的博客帖子,be found here美元.

Jille将该组件的实现描述为与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设置了我的工人,但我从未收到任何消息.它只是永远坐在那里,什么也不做.

我还需要做什么才能让事情恢复正常吗?

编辑

另外,如果它可能是有用的信息,这是我的联系人:

#[AsMessageHandler]
final class TestMessageHandler
{
    public function __invoke(TestScheduledMessage $message)
    {
        // do something with your message
    }
}

推荐答案

因此,它与Messenger组件并不完全一样,因为传输不能在Messenger.yaml配置中定义.SchedulerProvider自动设置队列,如果队列已经存在,则不执行任何操作.

删除上面代码中的scheduler_default传输,然后将消息路由到另一个传输,比如默认的async,它就可以工作了.

示例:

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

因为没有文档,而且博客文章说它的配置与Messenger组件相同,所以我错误地假设您也必须配置传输.

不过,调度程序传输仍然需要它的特定工作进程,就像任何常规的信使传输一样.

Php相关问答推荐

为什么PHP输出\n而不是实际创建一个新元素?

PHP FFI—Convert void * to int

在Laravel中修改JSON输出

WooCommerce在购买后多次重定向

如何不重新查询模型A-&>;相关模型B-&>模型

CKEDITOR-如何在PHP中判断提交后的空数据

如何在WordPress REST API中判断应用程序密码

获取作者';在WordPress中使用PHP

以编程方式同步 WPML 翻译更改 Woocommerce 产品销售价格

如何使用 PHP 创建简化的 twig 替换?

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

Filament PHP v3:在禁用的表单字段上,ID 不会写入数据库

如果 Select 的县不是store 所在的县,如何隐藏本地自提?

WooCommerce 按产品运输插件:仅收取较高的运输费用

由于 PHP 版本不受支持,如何终止 PHP 脚本?

在特征中使用类的属性

PHP / DOM : 解析 HTML 以提取基于类的数​​据

正则表达式抓取递归括号的内容

Laravel 从嵌套数组的第二级获取最后一项

PHP Remedy API 调用以创建附件无效的条目(使用 Postman Works!)