Laravel框架中提供了便捷的队列服务使用方法,如果使用的是redis、database、sqs等作为异步队列的驱动,都会配置有对应的队列名称,来看下框架提供的默认redis驱动的配置:
这里配置的是使用redis驱动队列的队列连接名称、队列名称、超时时间。
但是如果我们要指定不同的任务队列使用不同的队列名称,该怎么办?
在官方文档中如果是Job可以使用dispatch(new Job())->onQueue('queue_name')来触发执行到指定的队列。但是事件(Event)中怎么使用指定名称的队列呢?
经过一番,查阅框架源码发现,
这里在处理事件监听使用队列处理的时候,会首先检查当前监听类是否存在queue方法。
这里回调了当前监听的queue来处理队列。
由此我们大概应该知道怎么来写监听类的队列处理了吧!如下:
当然,这里还要提及的一点是,在Laravel的Artisan命令queue:work中,默认指定的是'default'队列的监听,如果是你使用了其他队列名称,就要在使用php artisan queue:work 命令中使用--queue来指定监听的队列 。
php artisan queue:work --queue="default,listener_queue"
--queue参数中,队列名称的先后决定了队列处理的优先级
。
在Laravel 5.0 以上版本中,可以直接在Job中定义 $queue 属性,可以省去在其他地方调用Job 指定队列名称。
<?php
namespace App\Jobs;
use App\Exceptions\JsonException;
use App\Http\Business\CheckStock\CheckStockBusiness;
use Carbon\Carbon;
/**
* 更新采纳比例
*
* Class UpdateCheckStockManageAcceptRate
* @package App\Jobs
* @author jiangxianli
* @created_at 2019-06-04 14:28
*/
class UpdateCheckStockRecommendMarkRate extends Job
{
/**
* 运行队列名称
*
* @var string
*/
public $queue = "update-check-stock-recommend-mark-rate";
/**
* 荐股ID
*
* @var
*/
private $check_stock_id;
/**
* 构造函数
*
* UpdateCheckStockManageAcceptRate constructor.
* @param $check_stock_id
*/
public function __construct($check_stock_id)
{
$this->check_stock_id = $check_stock_id;
}
/**
* 更新跟踪成绩
*
* @param CheckStockBusiness $check_stock_business
* @throws JsonException
* @throws \App\Exceptions\ApiException
* @author jiangxianli
* @created_at 2019-06-04 15:44
*/
public function handle(CheckStockBusiness $check_stock_business)
{
$check_stock_business->updateRecommendMarkRate($this->check_stock_id);
}
}