Почему BroadCastEvent стоят в очереди в Laravel? Как это остановить?

Я работаю над проектом, который должен транслировать широту и долготу в режиме реального времени

У меня есть что-то вроде ниже

namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Support\Facades\Redis;

class TrackersBroadcast extends Event implements ShouldBroadcast
{
        public  $lat, $lng,$imei,$date_time

    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(
                                    $lat, 
                                    $lng, 
                                    $imei, 
                                    $date_time 

                                )

    {
        $this->lat = $lat;
        $this->lng = $lng;
        $this->imei = $imei;
        $this->date_time = $date_time;

    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['tracker-channel'];
    }


}

В некоторых случаях мне нужно запускать электронную почту в реальном времени, поэтому я решил реализовать очередь сообщений laravel, как показано ниже

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Mail;

class SendAlertEmail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    public  $data;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data=$data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        Mail::send('emails.test', ['testVar' => $this->data], function($message) {
            $message->from('no-reply@sample.com', 'Website Name');
            $message->to('developer@gmail.com')->subject('A simple test');
        });
    }
}

всякий раз, когда я бегу php artisan queue:listen database это поставит в очередь мое вещательное событие также. Я не хочу ставить в очередь событие трансляции. Как это сделать?

3 ответа

Решение

Потому что Laravel Event Broadcasting ставится в очередь по умолчанию, если вы расширяете ShouldBroadcast интерфейс. Если вы не хотите, чтобы Event Broadcasting поставили в очередь, вы должны расширить ShouldBroadcastNow интерфейс.

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class TrackersBroadcast implements ShouldBroadcastNow
{
......
}

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

В Laravel все трансляции событий ставятся в очередь по умолчанию.

Перед трансляцией событий вам также необходимо настроить и запустить прослушиватель очереди. Все трансляции событий выполняются с помощью заданий в очереди, поэтому время отклика вашего приложения не будет серьезно затронуто.

В вашем случае вам понадобятся два драйвера очереди. Один для трансляции событий с поддержкой в ​​реальном времени. Один для обработки электронной почты с поддержкой очередей. Для этого вам понадобятся два драйвера очереди. Вы можете определить их в config/queue.php

В вашем SendAlertEmail класс сделать это.

public $broadcastQueue = 'queue-name-for-handling-emails';

В вашем TrackersBroadcast указать очередь в реальном времени. Это ваша redis водитель очереди.

public $broadcastQueue = 'real-time-queue';

См. Очередь широковещания в разделе Определение событий широковещания

Тогда вы можете слушать ваши две очереди, как это

$php artisan queue:listen --queue="queue-name-for-handling-emails"
$php artisan queue:listen --queue="real-time-queue"

См. Почему трансляция событий стоит в очереди?

Надеюсь, вы найдете это полезным.

Может быть, вы можете упомянуть имя очереди в трансляции событий, как это, и не слушайте эту очередь, если вам не нужно обрабатывать

//php artisan queue:listen --queue=broadcast-queue

    /**
         * @return string
         */
        public function onQueue()
        {
            return 'broadcast-queue';
        }
Другие вопросы по тегам