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

ShouldBroadcastインターフェイスを拡張すると、Laravel Event Broadcastingがデフォルトでキューに入れられているためです。イベントブロードキャストをキューに入れたくない場合は、ShouldBroadcastNowインターフェイスを拡張する必要があります。

これは、イベントブロードキャストが同期キュードライバを使用することを意味します。

+1

パーティーが遅くなりました。これは実際に問題を解決するために私を助けた – sumit

+0

申し訳ありません、私は遅れています;) – nmfzone

1

は、あなたがこのような放送イベントでキュー名を言及することができますし、すべてのイベントの放送がキューイングされLaravelで

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

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

を処理する必要はありません包みそのキューを聞いていないかもしれませデフォルトでは

イベントをブロードキャストする前に、キューリスナーも設定して実行する必要があります。すべてのイベントブロードキャストは、アプリケーションの応答時間に重大な影響を与えないように、キューに入れられたジョブを介して行われます。

2つのキュードライバが必要になる場合があります。リアルタイムのサポートでイベント放送用のもの。キューをサポートしている電子メールを処理するためのもの。このために、2つのキュードライバが必要になります。あなたはそれらを定義することができますconfig/queue.php

あなたのSendAlertEmailクラスでこれを行います。

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

あなたのTrackersBroadcastには、リアルタイムキューがあります。これはあなたのredisキュードライバです。

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

Why event broadcast is queued ?

を参照してください。そして、あなたはこの

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

のようなあなたの2つのキューをリッスンすることができますBroadcast queue

Defining broadcast events下を参照してくださいあなたは、これが役に立つことを願っ。

+0

解決策は2つのキューを分離することです。私はキューからブロードキャストイベントを除外する必要があります。私は、すべてのイベント放送が待ち行列に入っていることに気づき、それについて気にするべきではありません。あなたの貢献に感謝します。 – sumit

関連する問題