Укажите очередь для продвижения в классе событий

Я работаю с несколькими очередями и хочу отправить событие в очередь, отличную от очереди по умолчанию.

У меня есть стандартный класс событий, который реализует ShouldQueue, но как я могу указать очередь, в которую будет помещено это событие?

Я пробовал с

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

но это не то, что я хочу. Есть ли способ сделать это?


person baao    schedule 26.07.2015    source источник
comment
Проведя некоторое время с исходным кодом Laravel, я почти уверен, что это невозможно. createClassCallable Events / Dispatcher.php проверяет, есть ли в вашем классе реализации ShouldQueue, и если да, то вызывает метод createQueuedHandlerCallable() диспетчера, который, в свою очередь, ставит ваше событие в очередь с вызовом $this->resolveQueue()->push().   -  person Ben Claar    schedule 27.07.2015
comment
это тоже результат моего исследования. Я думаю, что можно было бы установить Config::set('queue.default','redis') перед вызовом события, но у меня было несколько очередей, которые при этом помещались не в ту очередь. Для этого я изменил способ обработки очередей. Если вы хотите разместить свой комментарий в качестве ответа, я его приму. @Ben Спасибо за уделенное время!   -  person baao    schedule 27.07.2015
comment
Да, у меня была такая же мысль об изменении очереди по умолчанию, но это кажется неправильным и подверженным ошибкам.   -  person Ben Claar    schedule 27.07.2015


Ответы (3)


На слушателе:

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


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

будь счастлив =)

person brnmonteiro    schedule 11.04.2017

Проведя некоторое время с исходным кодом Laravel, я почти уверен, что это невозможно.

createClassCallable Events / Dispatcher.php проверяет, есть ли в вашем классе реализации ShouldQueue, и если да, то вызывает метод createQueuedHandlerCallable() диспетчера, который, в свою очередь, ставит ваше событие в очередь с вызовом $this->resolveQueue()->push().

Проблема в том, что третий аргумент push - это то, в какую очередь нажимать, и этот аргумент не передается. Таким образом, он всегда будет использовать очередь по умолчанию, поэтому у вас нет возможности указать альтернативную очередь по умолчанию.

Я рекомендую самому поставить мероприятие в очередь с чем-то вроде:

Queue::push(
    function() {
        event(new NewMessageArrived());
    },
    '',
    'my-queue'
);
person Ben Claar    schedule 27.07.2015

public function __construct()
{
    $this->queue = 'high';
}

Я попытался переопределить $queue, потому что он общедоступен, но laravel 5.6 возвращает ошибки.

Итак, установка очереди в конструкции класса - это самое короткое рабочее решение, которое я нашел.

person ihsanberahim    schedule 20.05.2018