Laravel 的队列服务使用

2 篇文章 0 订阅

驱动器设置

驱动器使用MySQL表的可以参考手册

这里我使用的是redis,在设置queue之前,我们在数据库配置文件中新加一个connection ,原因是我想让队列任务单独使用一个库。

之后,修改驱动文件 queue

这里queue参数是指默认的队里名称,retry_after 这个选项指定了任务最多处理多少秒后就被当做失败重试了。

配置完后,修改配置文件.env的queue驱动为redis

 

生成任务类,建议使用命令生成

php artisan make:job UpdateUserBehaviorShence
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

use Illuminate\Support\Facades\Log;

class UpdateUserBehaviorShence implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;


    /**
     * 任务最大尝试次数。
     * 参数指定任务的最大重试次数。如果不指定,任务就会永久重试
     * 当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面
     * @var int
     */
    public $tries = 5;


    /**
     * 任务运行的超时时间。
     * 队列处理器最多执行多长时间后就应该被关闭掉
     * @var int
     */
    public $timeout = 120;



    public $a,$b,$c;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($a,$b,$c)
    {
        //
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;

    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
            $sss = [
                'ar' => $this->a,
                'br' => $this->b,
                'cr' => $this->c
            ];

            //加载神策类,执行神策代码

            Log::info(json($sss));

    }


    /**
     * 要处理的失败任务。
     *
     * @param  Exception  $exception
     * @return void
     */
    public function failed(\Exception $e)
    {
        // 给用户发送失败通知,等等...

        var_dump([
            'title' => 'shence:upuserd',
            'code' => $e->getCode(),
            'file' => $e->getFile(),
            'line' => $e->getLine(),
            'msg' => $e->getMessage(),
            'time' => date('Y-m-d H:i:s',time()),
        ]);


        Log::info([
            'title' => 'shence:upuserd',
            'code' => $e->getCode(),
            'file' => $e->getFile(),
            'line' => $e->getLine(),
            'msg' => $e->getMessage(),
            'time' => date('Y-m-d H:i:s',time()),
        ]);

    }




}

这个任务类我故意留了一个错误,让任务不能正常执行

下边在action中,分发任务,这个action的路由自定义

        $iUserId = '234';
        $sClientType = 'sClientType';
        $sLoginType = 'sLoginType';
        $event = 'login';
        \App\Jobs\UpdateUserBehaviorShence::dispatch($iUserId, $sClientType, $sLoginType)
//            ->onConnection('shenceconn')
            ->onQueue('shence');

刷新action分发任务。。。。。

刷新之后我们连接redis,并选择数据库,这里我用的第四个库

redis-cli -h 127.0.0.1 -p 6379

select 3

查看没有执行的队列数据

LRANGE "queues:shence" 0 -1

现在队里中已经有还没有被执行的任务了。。

接下来运行队列处理器

php artisan queue:work redis --queue=shence --timeout=60 --sleep=3 --tries=2

执行队列报错的话会写入数据表failed_jobs中

这个ID 等于3的记录就是新生成的错误队列信息,这个表中exception字段记录了错误原因

我们可以执行一系列命令对错误的队列进行重置、查看、删除等处理

使用php artisan queue:failed 查看错误队列信息

将第二条重新放回未执行队列队列中

php artisan queue:retry 2

再次查看

2被放回之后只剩3

查看redis中的队列

我们再把3放回去再次查看redis队列

现在是2条了,具体详细的命令可以参考手册,手册很详细。。

通过这个小测试,理解下laravel队列的工作流程。。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值