Laravel 5.1: событие очереди в фоновом режиме не работает

Я создал тестовое событие в папке \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);

Когда я сохраняю свою модель, событие обрабатывается синхронно. Таким образом, метод дескриптора события не обрабатывается очередью.

В документах говорится о реализации контракта ShouldBeQueued в слушателе, что и имеет место в моем слушателе. Однако как я должен на самом деле отправить метод дескриптора события в очередь? Какие шаги мне здесь не хватает? Где я могу объявить, в какую очередь/трубку должно быть отправлено событие? Я использую Amazon SQS для обработки своих очередей.

Документы laravel немного сбивают с толку в этом вопросе...

Любая помощь приветствуется.


person cenob8    schedule 19.08.2015    source источник
comment
Я думаю, что документы довольно просты, laravel.com/docs/ 5.1/queues#push-jobs-to-the-queue. У вас должен быть запущен фоновый процесс для прослушивания очереди:php artisan queue:listen   -  person yangqi    schedule 19.08.2015
comment
да, слушатель работает, но проблема в том, что я не могу установить очередь. У меня есть несколько очередей, поэтому он просто принимает очередь по умолчанию в файле конфигурации очереди.   -  person cenob8    schedule 20.08.2015
comment
согласно документам, вы можете использовать onQueue('queue_name') чтобы указать, на что вы хотите отправить задание. $job = (new SendReminderEmail($user))->onQueue('emails'); $this->dispatch($job);   -  person yangqi    schedule 20.08.2015


Ответы (1)


Решение состоит в том, чтобы добавить метод очереди, в котором вы можете установить конкретную трубку, на которую должно быть отправлено событие:

public function queue($queue, $command)
{
    $queue->pushOn('your_queue_name',$command);
}
person cenob8    schedule 21.08.2015
comment
Лол, спасибо, я не могу поверить, как сложно было это придумать! Я был близок к тому, чтобы передать это самому слушателю, но это казалось не совсем L-ишским. Спасибо еще раз. - person Michael Black Ritter; 28.11.2015