Прослушиватели Laravel с очередью не выполняются

#laravel #redis #queue #listener #laravel-events

#laravel #redis #очередь #прослушиватель #laravel-события

Вопрос:

Я пытаюсь заставить слушателей работать с очередью. Все настроено правильно для подключения к серверу Redis.

Событие

 class BillingEvent extends BaseEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    private $event;
    private $data;

    public function __construct(Subscription $subscription, $event, $data = [])
    {
        parent::__construct($subscription);
        $this->event = $event;
        $this->data = $data;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return IlluminateBroadcastingChannel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }

    public function getEvent()
    {
        return $this->event;
    }

    /**
     * If we need to know additional data.
     * @return array
     */
    public function getData(): array
    {
        return $this->data;
    }
}
  

Прослушиватель

 class BillingEventListener implements ShouldQueue
{
    use InteractsWithQueue;

    public function handle(BillingEvent $event)
    {
        Log::error($event->getEvent()." test !!! ");
    }

    public function failed(BillingEvent $event, $exception)
    {
        //
    }
}
  

Вот как я запускаю событие:

 $sub = Subscription::find(1);
event(new BillingEvent($sub, LogEvents::BILLING_SUBSCRIPTION_CANCELLED));
  

После четных срабатываний я просматриваю свое хранилище Redis, чтобы посмотреть, сохранено ли что-то, и оно есть.

1) «очереди: по умолчанию: уведомлять» 2) «очереди: по умолчанию»

Когда я смотрю на очереди: по умолчанию он имеет JSON.

{ «DisplayName»: «App Listeners BillingEventListener», «job»: «IlluminateQueue CallQueuedHandler@call», «maxTries»: null, «timeout»: null, «timeoutAt»: null, «data»: { «CommandName»: «IlluminateEventsCallQueuedListener», «команда»: «O:36:»IlluminateEventsCallQueuedListener»:7:{s:5:»class»;s:34:»AppListenersBillingEventListener»;s:6:»method»;s:6:»handle»;s:4:»data»;a:1:{i:0;O:23:»AppEventsBillingEvent»:3:{s:30:»u0000AppEventsBillingEventu0000event»;s:30:»billing_subscription_cancelled»;s:29:»u0000AppEventsBillingEventu0000data»;a:0:{}s:6:»socket»;N;}}s:5:»tries»;N;s: 9: «Тайм-аут»; N; s: 7: «тайм-аут»; N; s: 6: «u0000 * u0000job»; N;}» }, «telescope_uuid»: «8d6dcd7a-5747-41e5-84ec-082828c94ffa»,»id»: «hUmv4Pis9adXyBW5kLHoCAai18sFExBe», «попыток»: 0 }

Очередь работает, но код в функции handle никогда не вызывается. Когда я настраиваю синхронизацию своего драйвера очереди, все выполняется сразу.

Я получил по умолчанию соединение Redis в очереди:

 'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => env('REDIS_QUEUE', 'default'),
    'retry_after' => 90,
    'block_for' => null,
]
  

Ответ №1:

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

Если мы используем redis, нам нужно запустить и запустить это задание cron: очередь php artisan: работа redis

Это работает для параметра очереди синхронизации: очередь php artisan: работа

Надеюсь, это поможет