Laravel事件监听+队列异步处理

https://blog.csdn.net/why444216978/article/details/101455602

 

单独队列处理############################

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Models\Poststest;
use Illuminate\Support\Facades\Log;

class SendReminderEmail implements ShouldQueue
{
//生成的类实现了 Illuminate\Contracts\Queue\ShouldQueue 接口,
//这意味着这个任务将会被推送到队列中,而不是同步执行。
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $posts;

    /**
     * Create a new job instance.
     * 创建一个新的任务实例。
     * @return void
     */
    public function __construct(Poststest $pp)
    {
        //
        $this->posts = $pp;
    }

    /**
     * Execute the job.
     * 让队列用来调用此任务的 handle 方法
     *
     * @return void
     */
    public function handle()
    {
        //
//        echo "队列调用任务SendReminderEmail 打印出任务类的实例<br>-------------";
        Log::info([
            'id' => $this->posts->id,
            'title' => $this->posts->title
        ]);

//        print_r($this->posts);
    }
}

 

事件监听器队列############################

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use  App\Models\Poststest;

/**
 * Class OrderShipped 事件
 * @package App\Events
 */
class OrderShipped
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $post;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Poststest $post)
    {
        //
        $this->post = $post;
//        echo "事件OrderShipped以调用,即将分发到监听器<br>--------------------";
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}
<?php

namespace App\Listeners;

use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
/**
 * Class SendShipmentNotification 监听器
 * @package App\Listeners
 */
class SendShipmentNotification implements ShouldQueue
{
    use InteractsWithQueue;
    /**
     * 任务应该发送到的队列的名称
     *
     * @var string|null
     */
    public $connection = 'database';

    public $queue = 'listeners';

    public $delay = 60 * 1;


    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  OrderShipped  $event
     * @return void
     */
    public function handle(OrderShipped $event)
    {
        $ee = $event->post->id;
        echo "监听器SendShipmentNotification处理中。。。。<br/>-----------------------";
//        print_r($ee);
//        return false;
        Log::info("队列处理:" . $ee);

//        return false;
    }


    //有时候队列中的事件监听器可能会执行失败。如果队列中的监听器任务执行时超出了队列进程定义的最大尝试次数,
    //failed 方法接收事件实例和导致失败的异常
    public function failed(OrderShipped $event, $exception)
    {
        //
    }




}
<?php

namespace App\Listeners;

use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;

class SendShipmentNotification2
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  OrderShipped  $event
     * @return void
     */
    public function handle(OrderShipped $event)
    {
        $ee = $event->post->id;
        echo "监听器SendShipmentNotification2处理中。。。。<br/>-----------------------";
//        print_r($ee);
//        return false;
        Log::info("非队列处理:" . $ee);

//        return false;
    }

}

 

创建控制器方法调用@@@@@@@@@@@@@@(

Route::get('posts', 'PostsController@shijianfenfa');

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Events\OrderShipped;
use App\Models\Poststest;
use App\Jobs\SendReminderEmail;
use Carbon\Carbon;
class PostsController extends Controller
{
    //
    public  function shijianfenfa()
    {
        $pp = Poststest::all();

//        print_r($pp);
        //事件分发 部分任务加入队列延迟1分钟
        foreach ($pp as $item) {
            event(new OrderShipped($item));
        }




//        队列
//        加入队列延迟3分钟
        foreach ($pp as $item) {
            SendReminderEmail ::dispatch($item)->delay(Carbon::now()->addMinutes(3));
        }

//        SendReminderEmail::dispatch(Poststest::all())->delay(Carbon::now()->addMinutes(10));

    }
}

访问控制器将任务加入队列

 运行队列命令:我这里定义了两个队列名字 listeners default

php artisan queue:work database --queue=listeners,default

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值