2016-12-30 1 views
8

Я работаю над проектом, который необходимо транслировать широты и долготы на реальное времяПочему 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('[email protected]', 'Website Name'); 
      $message->to('[email protected]')->subject('A simple test'); 
     }); 
    } 
} 

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

enter image description here

+0

Какой драйвер вы используете для трансляции событий? Редис или толкач? – vijaykumar

+0

Я использую redis – sumit

+0

Вы можете добиться этого, используя несколько процессов очереди, как я упомянул в ответе ниже. – Gayan

ответ

3

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

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; 

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

Это означает, что ваше вещание событий будет использовать драйвер очереди синхронизации.

+1

Поздно к вечеринке. Это действительно помогло мне решить проблему. – sumit

+0

Прости, я опаздываю;) – nmfzone

1

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

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

    /** 
     * @return string 
     */ 
     public function onQueue() 
     { 
      return 'broadcast-queue'; 
     } 
3

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

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

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

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

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

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

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

См Broadcast queue под Defining broadcast events

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

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

См Why event broadcast is queued ?

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

+0

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

Смежные вопросы