thinkphp 6实现think-queue redis队列

发布于:2023-10-25 ⋅ 阅读:(81) ⋅ 点赞:(0)

首先需要安装扩展

composer require topthink/think-queue
composer require predis/predis

然后配置redis参数,账号密码。

app目录下新建job目录,新建文件MultiTask.php 

<?php


namespace app\job;

use think\queue\Job;

class MultiTask
{
    public function taskA(Job $job, $data)
    {

        $isJobDone = $this->_doTaskA($data);

        if ($isJobDone) {
            $job->delete();
            print("Info: TaskA of Job MultiTask has been done and deleted" . "\n");
        } else {
            $job->release(3);
            print("任务3s后再次被执行");
        }
        if ($job->attempts() > 3) {
            print("Job has been retried more than 3 times!");
            $job->delete();
        }
    }

    public function taskB(Job $job, $data)
    {

        $isJobDone = $this->_doTaskB($data);

        if ($isJobDone) {
            $job->delete();
            print("Info: TaskB of Job MultiTask has been done and deleted" . "\n");
        } else {
            $job->release(3);
            print("任务3s后再次被执行");
        }
        if ($job->attempts() > 3) {
            print("重试三次失败,删除");
            $job->delete();
            return false;
        }
    }

    private function _doTaskA($data)
    {
        print("Info: doing TaskA of Job MultiTask " . "\n");
        return false;
//        return true;
    }

    private function _doTaskB($data)
    {
        print("Info: doing TaskB of Job MultiTask " . "\n");
        return false;
//        return true;
    }
}

其中$data就是redis存储的参数,会自动json_decode,取来可直接进行相应的逻辑操作。

添加任务队列时:

   /**
     * 多任务
     * @param Request $request
     * @return string
     */
    public function multiTask(Request $request)
    {
        $param = $request->param();
        $taskType = $param['taskType'];
        switch ($taskType) {
            case 'taskA':
                $jobHandlerClassName = 'app\job\MultiTask@taskA';
                $jobQueueName = "multiTaskJobQueue";
                $jobDataArr = ['a' => '1'];
                break;
            case 'taskB':
                $jobHandlerClassName = 'app\job\MultiTask@taskB';
                $jobQueueName = "multiTaskJobQueue";
                $jobDataArr = ['b' => '2'];
                break;
            default:
                break;
        }
        //Queue::later();//立即执行
        //$isPushed = Queue::later(10, $jobHandlerClassName, $jobDataArr, $jobQueueName);//延时队列10s后执行
        $isPushed = Queue::push($jobHandlerClassName, $jobDataArr, $jobQueueName);
        if ($isPushed !== false) {
            return '队列添加成功';
        } else {
            return '插入失败了';
        }
    }

根据业务需求更改参数,亲测可用。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到