【问题标题】:Laravel 5.1 : Queue event in background not workingLaravel 5.1:后台队列事件不起作用
【发布时间】:2015-08-19 14:06:25
【问题描述】:

我在 \app\Events\TestEventTriggered.php 下创建了一个测试事件:

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class TestEventTriggered extends Event
{
    use SerializesModels;


    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {        }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return [];
    }
}

还有一个 app\Listeners\ListenToMyEvent.php 下的事件监听器:

<?php

namespace App\Listeners\Events;

use App\Events\TestEventTriggered;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class ListenToMyEvent implements ShouldBeQueued
{
    use InteractsWithQueue;

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  TestEventTriggered  $event
     * @return void
     */
    public function handle(TestEventTriggered $event)
    {
        // do some stuff
    }
}

在 app\Providers\EventServiceProvider.php 中:

protected $listen = [
    'App\Events\TestEventTriggered' => [
        'App\Listeners\ListenToMyEvent'
    ]
];

然后我在模型的保存方法中触发事件:

\Event::fire(new \App\Events\TestEventTriggered);

当我现在保存我的模型时,事件会同步处理。所以事件的handle方法没有被队列处理。

文档说要在侦听器中实现 ShouldBeQueued 合同,我的侦听器就是这种情况。但是,我应该如何将事件的句柄方法实际推送到队列中?我在这里缺少哪些步骤?我在哪里声明应该将事件推送到哪个队列/管? 我正在使用 Amazon SQS 来处理我的队列。

laravel 文档对这个问题有点困惑......

感谢任何帮助。

【问题讨论】:

  • 我认为文档很简单,laravel.com/docs/5.1/queues#pushing-jobs-onto-the-queue。需要有后台进程运行才能监听队列:php artisan queue:listen
  • 是的,监听器正在运行,但问题是我无法设置队列。我有几个队列,所以它只需要队列配置文件中的默认队列
  • 根据文档,您可以使用 onQueue('queue_name') 指定要将作业分派到哪个位置。 $job = (new SendReminderEmail($user))-&gt;onQueue('emails'); $this-&gt;dispatch($job);

标签: laravel events queue amazon-sqs laravel-5.1


【解决方案1】:

解决方案是添加一个队列方法,您可以在其中设置事件应发送到的特定管:

public function queue($queue, $command)
{
    $queue->pushOn('your_queue_name',$command);
}

【讨论】:

  • 大声笑,谢谢,我无法相信这个想法是多么艰难!我差点自己在听众中发送它,但这似乎并不完全是“L-ish”。再次感谢。
猜你喜欢
  • 2016-04-04
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多