【问题标题】:Specify queue to push on in an Event Class在事件类中指定要推送的队列
【发布时间】:2015-07-26 15:15:29
【问题描述】:

我正在处理多个队列,并希望将一个事件推送到另一个队列而不是默认队列。

我有一个实现 ShouldQueue 的标准事件类,但是如何指定这个事件将被推送到的队列?

我试过了

class NewMessageArrived extends Event implements ShouldQueue
{
    use SerializesModels;
    protected $queue = 'redis';
    ....

但这不符合我的要求。有没有办法做到这一点?

【问题讨论】:

  • 在使用 Laravel 源代码花了一些时间之后,我相当确定这是不可能的。 Events/Dispatcher.php 的createClassCallable 检查您的类是否实现了ShouldQueue,如果是,则调用Dispatcher 的createQueuedHandlerCallable() 方法,然后通过调用$this->resolveQueue()->push() 将您的事件排队。
  • 这也是我的研究结果。我认为可以通过在事件调用之前设置Config::set('queue.default','redis') 来实现,但是这样做时我有一些队列被推到了错误的队列中。我现在已经改变了处理队列的方式。如果您想发表评论作为答案,我会接受。 @Ben 谢谢你的时间!
  • 是的,我对更改默认队列也有同样的想法,但这似乎是错误的并且容易出错。

标签: php laravel queue laravel-5.1


【解决方案1】:

在监听器上:

public $queue = 'notifications'; //Queue Name


public function queue(QueueManager $handler, $method, $arguments)
{
    $handler->push($method, $arguments, $this->queue);
}

开心=)

【讨论】:

    【解决方案2】:

    在使用 Laravel 源代码花了一些时间之后,我相当确定这是不可能的。

    Events/Dispatcher.php 的 createClassCallable 检查您的类是否实现了 ShouldQueue,如果是,则调用 Dispatcher 的 createQueuedHandlerCallable() 方法,然后通过调用 $this->resolveQueue()->push() 将您的事件排队。

    问题是 push 的第三个参数是要推送到哪个队列,而那个参数没有被传递。因此它将始终使用默认队列,因此您无法指定备用默认队列。

    我建议您自己排队参加活动,例如:

    Queue::push(
        function() {
            event(new NewMessageArrived());
        },
        '',
        'my-queue'
    );
    

    【讨论】:

      【解决方案3】:
      public function __construct()
      {
          $this->queue = 'high';
      }
      

      我试图覆盖 $queue,因为它是公开的,但是 laravel 5.6 返回错误。

      所以,在类构造中设置队列是我找到的最短的工作解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        相关资源
        最近更新 更多