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

Web 专栏收录该内容
68 篇文章 0 订阅

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

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\{InteractsWithQueue, SerializesModels};

abstract class Job implements ShouldQueue {
    use InteractsWithQueue, Queueable, SerializesModels;
}

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

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

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

方式一

任务类

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

<?php

namespace App\Jobs;

class ExampleJob extends Job {

    /** @var mixed */
    private $data;

    public function __construct($data) {
        $this->data = $data;
    }

    public function handle() {
        // 使用 $this->data 得到自定义数据
        print_r($this->data);
        echo "任务完成\n";
        $this->delete();
    }
}

发布任务

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

use App\Jobs\ExampleJob;
use Illuminate\Support\Facades\Queue;

Queue::push(new ExampleJob(['a' => 123]), null, 'QueueName');
Queue::later(10, new ExampleJob(['a' => 123]), null, 'QueueName'); // 10 秒后执行

执行/消费任务

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

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

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

如上是方式一的使用。


方式二

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

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

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

编写任务类

前提

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

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\{InteractsWithQueue, SerializesModels};
use Illuminate\Queue\Jobs\{Job as BaseJob, JobName};

abstract class Job implements ShouldQueue {
    /*
    |--------------------------------------------------------------------------
    | Queueable Jobs
    |--------------------------------------------------------------------------
    |
    | This job base class provides a central location to place any logic that
    | is shared across all of your jobs. The trait included with the class
    | provides access to the "queueOn" and "delay" queue helper methods.
    |
    */

    use InteractsWithQueue, Queueable, SerializesModels;

    /** @var BaseJob */
    protected $job;

    /** @var mixed */
    protected $data;

    /**
     * @param BaseJob $job
     * @param mixed   $data
     */
    public function fire(BaseJob $job, $data = null) {
        $payload = $job->payload();

        $class = JobName::resolve($payload['job'], $payload);

        $jobClass = new $class();

        $jobClass->job = $job;
        $jobClass->data = $data;

        $jobClass->handle();
    }
}

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

<?php

namespace App\Jobs;

class ExampleJob extends Job {

    /**
     * 构造函数形参必须留空或不写
     */
    //public function __construct() {
    //
    //}

    /**
     * 执行任务
     */
    public function handle() {
        print_r($this->data);
        echo "任务完成\n";
        $this->delete();
    }
}

发布任务

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

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

执行/消费任务

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

返回结果:

[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processing: App\Jobs\ExampleJob
Array
(
    [b] => 321
)
任务完成
[2019-04-15 14:14:42][ap45P4BRqafc47ESugdqWUm5gbowr4Zc] Processed:  App\Jobs\ExampleJob
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值