简体   繁体   English

为什么BroadCastEvent在Laravel中排队? 怎么阻止?

[英]Why BroadCastEvent are queued in Laravel? How to stop that?

I am working on the project which need to broadcast latitude and longitude on realtime 我正在研究需要实时广播纬度和经度的项目

I have something like below 我有类似下面的东西

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'];
    }


}

In some case I need to trigger real time email , so I decided to implement laravel message queue like below 在某些情况下,我需要触发实时电子邮件,所以我决定实现如下的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');
        });
    }
}

whenever I run php artisan queue:listen database it will queue my broadcasting event too . 每当我运行php artisan queue:listen database它也会排队我的广播事件。 I dont want to queue the broadcast event . 我不想排队广播事件。 How to do that? 怎么做?

在此输入图像描述

Because Laravel Event Broadcasting queued by default if you extend ShouldBroadcast interface. 因为如果扩展ShouldBroadcast接口,Laravel Event Broadcasting默认排队。 If you don't want Event Broadcasting queued, you should extend ShouldBroadcastNow interface. 如果您不希望事件广播排队,则应扩展ShouldBroadcastNow接口。

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

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

So It means your Event Broadcasting will using sync queue driver. 所以这意味着你的事件广播将使用同步队列驱动程序。

In Laravel all event broadcasting is queued by default. 在Laravel中,所有事件广播都默认排队。

Before broadcasting events, you will also need to configure and run a queue listener. 在广播事件之前,您还需要配置并运行队列侦听器。 All event broadcasting is done via queued jobs so that the response time of your application is not seriously affected. 所有事件广播都是通过排队的作业完成的,这样您的应用程序的响应时间就不会受到严重影响。

In you case you gonna need two queue drivers. 在你的情况下,你将需要两个队列驱动程序。 One for event broadcasting with real time support. 一个用于实时广播和实时支持。 One for handling emails with queue support. 一个用于处理具有队列支持的电子邮件。 For this you gonna need two queue drivers. 为此你需要两个队列驱动程序。 You can define them in config/queue.php 您可以在config/queue.php定义它们

In your SendAlertEmail class do this. 在您的SendAlertEmail类中执行此操作。

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

In your TrackersBroadcast state the real time queue. TrackersBroadcast状态下实时队列。 This is your redis queue driver. 这是你的redis队列驱动程序。

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

Refer Broadcast queue under Defining broadcast events 定义广播事件下引用广播队列

Then you can listen for your two queues like this 然后你可以像这样听你的两个队列

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

Refer Why event broadcast is queued ? 请参阅为什么事件广播排队?

Hope you find this useful. 希望您觉得这个有帮助。

May be you can mention queue name in broadcast event like this and don't listen that queue incase you don't need to process 也许你可以在这样的广播事件中提及队列名称,并且不要在不需要处理的情况下监听该队列

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM