Слушатели Laravel с очередью не выполняются - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь заставить слушателей работать с очередью.Все настроено правильно для подключения к серверу 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 \Illuminate\Broadcasting\Channel|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) "queues: default: notify" 2) "queues: default"

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

{"displayName": "App \ Listeners \ BillingEventListener", "job": "Illuminate \ Queue \ CallQueuedHandler @ call", "maxTries": null, "timeout": null, "timeoutAt": null, "data": {"commandName": "Illuminate \ Events \ CallQueuedListener", "command":"О: 36: \" осветить \ События \ CallQueuedListener \ ": 7: {s: 5: \" класс \ "s: 34: \" App \ Слушателей \ BillingEventListener \ "; s: 6: \" метод \"; s: 6: \" ручка \ "; s: 4: \" данные \ "; а: 1: {я: 0; O: 23: \" App \ События \ BillingEvent \ ": 3: {s:30: \ "\ u0000App \ События \ BillingEvent \ u0000event \"; s: 30: \ "billing_subscription_cancelled \"; s: 29: \ "\ u0000App \ События \ BillingEvent \ u0000data \", а: 0: {} s:6: \ "гнездо \", N;}} s: 5: \ "пытается \", N; s:9: \ "timeoutAt \"; N; s: 7: \ "timeout \"; N; s: 6: \ "\ u0000 * \ u0000job \"; N;} "}," telescope_uuid ":" 8d6dcd7a-5747-41e5-84ec-082828c94ffa "," id ":" hUmv4Pis9adXyBW5kLHoCAai18sFExBe "," попытки ": 0}

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

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

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

1 Ответ

0 голосов
/ 12 апреля 2019

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

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

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

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

...