Laravel 事件触发器分发至Redis队列处理

10 篇文章 0 订阅

        Laravel 中的 event(事件)触发器分发至队列中进行异步业务/数据处理,那么这样之后可以快速做出响应而不用实时等待执行结果之后才能给使用者做出提示消息。

1 设置事件 app->events

/**
 * @author	Administrator
 * @date	2018年11月26日
 * @comment
 *
 */
class DuplicateDismissEvent
{
    
    use Dispatchable, InteractsWithSockets, SerializesModels;
    
    
    /**
     * 用户标记
     * @var unknown
     */
    public $uid;
    
    
    /**
     * 解散产品标记组
     * @var unknown
     */
    public $pids;
    
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct( $data )
    {
       
        $this->uid = $data[ 'uid' ]; 
        
        
        $this->pids = $data[ 'pids' ]; 
        
    }
    
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
    
}

2 设置事件监听器 app->Listeners

<?php


/**
 * 
 * @author	Administrator
 * @date	2018年12月6日
 * @comment
 *
 */
class DuplicateDismissListener implements ShouldQueue
{
    
    use InteractsWithQueue;
    
    /**
     * 任务应该发送到的队列的连接的名称
     *
     * @var string|null
     */
    public $connection = QueuesEnums::QUEUE_DRIVER_REDIS_ASYNC;
    
    /**
     * 任务应该发送到的队列的名称
     *
     * @var string|null
     */
    public $queue = QueuesEnums::QUEUE_NAME_API_RECEIVE_PRODUCTS;
    
    
    /**
     * 任务最大尝试次数
     *
     * @var int
     */
    public $tries = 2;
    
    
    /**
     * 任务运行的超时时间。
     *
     * @var int
     */
    public $timeout = 500;
    
    
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    
    
    
    /**
     * Handle the event.
     *
     * @param  Event  $event
     * @return void
     */
    public function handle( DuplicateDismissEvent $event )
    {
        
        if( !isset( $event->pids ) || !$event->pids )
        {
            return false;
        }
        
        //
        //业务处理区域
        //1 数据处理 
        
        //2 清理缓存
        
        //3 完成标记

        //4 日志记录
        
        
        return true;
        
    }
    
    
    /**
     * 失败事件处理器
     * @author	 Administrator
     * @datetime 2018年12月6日  下午2:49:36
     * @comment	
     * 
     * @param DuplicateDismissEvent $event
     * @param unknown $exception
     */
    public function failed( DuplicateDismissEvent $event, $exception)
    {
        //
        $this->delete();
    }
    
}

3 绑定事件与事件监听器 app->Providers:EventServiceProvider.php

/**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        
        'Illuminate\Auth\Events\Login'      => [ 'App\Listeners\LoginListener' ],
        'Illuminate\Auth\Events\Logout'     => [ 'App\Listeners\LogoutListener', ],
        'App\Events\ApiLogEvent'            => ['App\Listeners\ApiLogListener'],
        //解散相似事件 
        'App\Events\DuplicateDismissEvent'  => ['App\Listeners\DuplicateDismissListener'],
    ];

只需要将对应的事件与事件监听器绑定之后就可以采用 event( new DuplicateDismissEvent( $data ) ) 这种形式去触发,触发之后该任务则分发至队列中进行异步处理。

 

 

 

那么首先我们可以看到该事件监听器要做到可以分发队列必须实现类 ShouldQueue 并且内部引用InteractsWithQueue trait类则是对队列的入栈、出栈、释放任务的基本操作:https://laravel.com/api/5.6/Illuminate/Queue/InteractsWithQueue.html

connection 属性 表示该队列的执行驱动

queue属性 表示该任务名称即队列名称

tries属性 表示该任务失败重试次数

timeout属性 表示该任务的超时时长

 

那么该队列执行时会默认分发至 handle 方法中,所以我们只需在该方法中作业务方面的处理即可

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值