【问题标题】:Async Symfony events异步 Symfony 事件
【发布时间】:2015-11-17 17:10:03
【问题描述】:

我正在尝试使用https://github.com/fervo/FervoDeferredEventBundle 来让异步事件将数据存储在我的数据库中。事件已正确添加到 RabbitMQ 队列,但事件侦听器和事件本身永远不会执行。

我正在尝试两种方式:首先让侦听器完成这项工作,然后手动分派 deferevent。

有什么想法吗? 谢谢!

我的代码:

在我的控制器中:

$event = new DeferEvent('save.data', new SaveDataEvent($data));
$this->get('event_dispatcher')->dispatch('fervo.defer', $event);

SaveDataEvent.php

<?php

namespace AppBundle\Event;

use Symfony\Component\EventDispatcher\Event;

class SaveDataEvent extends Event
{
    protected $data;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function getData()
    {
        return $this->data;
    }

    public function saveData()
    {
        $data = $this->getData();
        // do more stuff
    }
}

SaveDataListener.php

<?php

namespace AppBundle\EventListener;

use AppBundle\Event\SaveDataEvent;

class SaveDataListener
{

    /**
     * @var SaveDataEvent
     */
    public function onSendData(SaveDataEvent $event)
    {

        $data = $event->saveData();
    }
}

services.yml

app.save_data_listener:
        class: AppBundle\EventListener\SaveDataListener
        tags:
            -
                name: kernel.event_listener #fervo_deferred_event.listener
                event: send.data

【问题讨论】:

  • YML中不应该是event: fervo.defer吗?
  • 我将其理解为我想要执行的事件,fervo.defer 是我的事件的包装器......但我完全不确定
  • 还有另一种解决 Symfony 异步事件的解决方案(我们构建的)。它需要的配置更少,更方便。要使侦听器异步,您只需将 async: true 属性添加到事件侦听器标记并在后台运行 enqueue:consume 命令。更多这里blog.forma-pro.com/symfony-async-eventdispatcher-d01055a255cf

标签: php symfony events rabbitmq


【解决方案1】:

阅读文档,您应该修复services.yml

app.save_data_listener:
    class: AppBundle\EventListener\SaveDataListener
    tags:
        name: fervo_deferred_event.listener
        event: fervo.defer

如果需要,将fervo.defer 替换为传递给dispatch() 方法的第一个值,它是已调度事件的名称。

【讨论】:

  • 但是像这样我将调度fervo.defer事件,但save.data事件和函数将永远不会执行
  • 所以你需要调用 ->dispatch('save.data', $event)。 dispatch 中的字符串必须与 YML 中的事件名称匹配。我建议您查看有关事件调度​​的 Symfony 文档
  • 据我了解这个捆绑包,我必须调度fervo.defer 事件,捆绑包将调度save.data 事件,这就是我使用它的原因。或者也许有更好的方法来做到这一点
  • 捆绑包应该如何知道启动 save.data 事件?那是基本的 SF 事件调度,bundle 使用不同的标签名称插入自己,事件名称由你决定,它是 save.data
  • 我也试过这样,它也不起作用。与往常一样,事件存储在 RabbitMQ 队列中但从未被消费,但它已发布。
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多