2016-12-30 26 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

您使用哪個驅動程序進行事件廣播? Redis還是推送器? – 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 queueDefining 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

相關問題