Laravel 事件觸發器分發至Redis隊列處理

        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 方法中,所以我們只需在該方法中作業務方面的處理即可

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章