#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: работа
Надеюсь, это поможет