Laravel中的队列处理
队列介绍
为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念–消息传递,而消息队列就可以在它上面扩展一下,把它说的更通俗些:从执行的角度去看,消息队列把原
来可直接调用的一个函数(一段程序或一个对象)放到另一个进程中了,所以它们之间的消息传递就从直接传递参数变成了以队列为载体来传递所需参数的一种方式.更加详细的介绍可以参考这篇文章
众所周知,laravel是个优雅的框架,它的队列处理也不例外,可以先看看手册
Laravel 5.2 文档 服务 —— 队列(这篇文章是英文版手册翻译,内容详尽).在基本了解它的使用之后,我们就可以来分析分析相关源代码,学习它的原理了(该篇文章只探讨基于Redis的队列服务).
队列Service
laravel把队列相关的服务全封装在一个Service里面,通过Queue Service Provider 注册到IOC中.在Queue Serivce里提供了多种服务,关于它做了什么请看以下代码中的注释(代码有点多,就不全部贴出来了)
public function register()
{
// 注册Manager, 而Manager为队列服务的统一入口
$this->registerManager();
// 注册队列的各种命令
$this->registerWorker();
$this->registerListener();
// 注册任务执行失败后的记录
$this->registerFailedJobServices();
// 未知
$this->registerQueueClosure();
}
讲配置文件
在Queue Service注入到IOC后,我们就可以使用队列了。
一个队列服务最基本的就是把任务写入队列,再将其拿出来执行, 很简单.所以队列服务最基本的要素有四点:任务,进队列,出队列,执行.在这里,我们就跟着这四个要素的步伐,看看它们在laravel中是如何实现的.这里,先以官方的示例来分析,有了一个具体概念之后再举一反三,学会它的本质。
任务
队列服务就是围绕着任务进行的.在手册上,通过它的实例SendReminderEmail
,我们可以很清楚地知道,laravel可以对一个任务做很多事,比如:可设置重新执行的次数,说明该任务(若失败)可以被执多次(针对的是单个Job);可设置是否可以延迟执行;对该Job设置处理的队列名称,等等.这些功能都是\Illuminate\Bus\Queueable
提供的,当然,实例中还有一个\Illuminate\Queue\InteractsWithQueue
,而它则是针对Job所用(稍后再说).一个任务建立完成后,就需要使其进入队列了。当然了,除了以上几个特点,还有任务的执行逻辑等等,要全面地了解任务,就需要清楚它的数据结构,其在队列中的数据结构会在进入队列中讲到.
任务进队列
示例中,在定义了任务之后,就将其用Controller中的方法使其进入了队列,那么这一点是如何实现的?
代码在:\Illuminate\Foundation\Bus\DispatchesJobs
protected functi