Lumen 消息队列传递自定义数据的两种方式

根据官方文档,所有自己编写的 任务类 需继承抽象类 app/Jobs/Job.php,内容如下:

1<?php 2 3namespace App\Jobs; 4 5use Illuminate\Bus\Queueable; 6use Illuminate\Contracts\Queue\ShouldQueue; 7use Illuminate\Queue\{InteractsWithQueue, SerializesModels}; 8 9abstract class Job implements ShouldQueue { 10 use InteractsWithQueue, Queueable, SerializesModels; 11}

实际编写中我们会发现,pushlater 方法的第一(later 是第二)个参数允许的类型是 string|object

而在 push 中的第一个参数我们传入 object 时,其第二个 $data 参数并不能被任务类所接收及使用,所以该参数传与不传没有任何影响

这里我们可以通过构造函数设置形参接收自定义数据,这是 方式一

方式一

任务类

新建或是直接使用框架默认的 ExampleJob.php 进行改造,内容如下:

1<?php 2 3namespace App\Jobs; 4 5class ExampleJob extends Job { 6 7 /** @var mixed */ 8 private $data; 9 10 public function __construct($data) { 11 $this->data = $data; 12 } 13 14 public function handle() { 15 // 使用 $this->data 得到自定义数据 16 print_r($this->data); 17 echo "任务完成\n"; 18 $this->delete(); 19 } 20}

发布任务

push 创建即时任务,later 创建延时任务

1use App\Jobs\ExampleJob; 2use Illuminate\Support\Facades\Queue; 3 4Queue::push(new ExampleJob(['a' => 123]), null, 'QueueName'); 5Queue::later(10, new ExampleJob(['a' => 123]), null, 'QueueName'); // 10 秒后执行

执行/消费任务

项目根目录下戳开命令行:php artisan queue:work --once --queue QueueName

不出意外会返回如下内容:

1[2019-04-15 13:09:32][4sn1YRaaxmugPNipBIgUBYiNbQxEEyD0] Processing: App\Jobs\ExampleJob 2Array 3( 4 [a] => 123 5) 6任务完成 7[2019-04-15 13:09:32][4sn1YRaaxmugPNipBIgUBYiNbQxEEyD0] Processed: App\Jobs\ExampleJob

如上是方式一的使用。


方式二

既然官方都给出了 $data 参数,那一定是有作用的。

根据源码得知,当第一个参数(以 push 为例)传入类型为 object 时,$data 参数并不会使用

而当传入类型为 string 时,$data 就会用到了,具体操作往下看↓↓↓

编写任务类

前提

如果采用这个方式编写任务类,得先改造 Job.php

1<?php 2 3namespace App\Jobs; 4 5use Illuminate\Bus\Queueable; 6use Illuminate\Contracts\Queue\ShouldQueue; 7use Illuminate\Queue\{InteractsWithQueue, SerializesModels}; 8use Illuminate\Queue\Jobs\{Job as BaseJob, JobName}; 9 10abstract class Job implements ShouldQueue { 11 /* 12 |-------------------------------------------------------------------------- 13 | Queueable Jobs 14 |-------------------------------------------------------------------------- 15 | 16 | This job base class provides a central location to place any logic that 17 | is shared across all of your jobs. The trait included with the class 18 | provides access to the "queueOn" and "delay" queue helper methods. 19 | 20 */ 21 22 use InteractsWithQueue, Queueable, SerializesModels; 23 24 /** @var BaseJob */ 25 protected $job; 26 27 /** @var mixed */ 28 protected $data; 29 30 /** 31 * @param BaseJob $job 32 * @param mixed $data 33 */ 34 public function fire(BaseJob $job, $data = null) { 35 $payload = $job->payload(); 36 37 $class = JobName::resolve($payload['job'], $payload); 38 39 $jobClass = new $class(); 40 41 $jobClass->job = $job; 42 $jobClass->data = $data; 43 44 $jobClass->handle(); 45 } 46}

然后还是就着默认的 ExampleJob.php 继续改造:

1<?php 2 3namespace App\Jobs; 4 5class ExampleJob extends Job { 6 7 /** 8 * 构造函数形参必须留空或不写 9 */ 10 //public function __construct() { 11 // 12 //} 13 14 /** 15 * 执行任务 16 */ 17 public function handle() { 18 print_r($this->data); 19 echo "任务完成\n"; 20 $this->delete(); 21 } 22}

发布任务

和方式一不同点就是用上了 $data 参数

1// push 方法第二个参数可传入对象、数组、字符串等类型 2Queue::push(ExampleJob::class, ['b' => 321], 'QueueName'); 3Queue::later(10, ExampleJob::class, ['b' => 321], 'QueueName');

执行/消费任务

项目根目录下戳开命令行:php artisan queue:work --once --queue QueueName

返回结果:

1[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processing: App\Jobs\ExampleJob 2Array 3( 4 [b] => 321 5) 6任务完成 7[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processed: App\Jobs\ExampleJob
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )