TP5 Queue 队列 任务无法调用

浏览:1582 发布日期:2021/02/05 分类:求助交流 关键字: Redis 队列 Queue
<?php
namespace app\admin\controller;

use think\Controller;
use think\Session;
use think\Cookie;
use think\Db;
use think\Loader;
use think\Request;
use think\Cache;
use think\Queue;

/**
 * 订单管理
 */
class Order extends Base{
    /**
     * @name 订单管理
     * @method get
     * @param keywords string 订单管理
     * @return view
     */
    public function all_order()
    {

       // 1.当前任务将由哪个类来负责处理。
        //   当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
        $jobHandlerClassName  = 'app\admin\controller\DoJo@fire';
        // 2.当前任务归属的队列名称,如果为新队列,会自动创建
        $jobQueueName  = "testduilie";
        // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
        //   ( jobData 为对象时,存储其public属性的键值对 )
        $jobData =array(
            '0'=>['type'=>2, 'data_id' => 12,'ts' => time()],
            '1'=>['type'=>3, 'data_id' => 12,'ts' => time()],
            '2'=>['type'=>4, 'data_id' => 12,'ts' => time()],
            '3'=>['type'=>5, 'data_id' => 12,'ts' => time()],
            '4'=>['type'=>6, 'data_id' => 12,'ts' => time()],
        );
        // 4.将该任务推送到消息队列,等待对应的消费者去执行
        $isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName );
    //    dump($isPushed);//字符串
        if( $isPushed !== false ){
            return '消息已发出';
        }else{
            return '消息发送出错';
        }
        exit;
同时也在'app\admin\controller\DoJob模块下创建控制和方法,但是无法调用namespace app\admin\controller;

use think\Controller;
use think\Exception;
use think\Queue;
use think\Queue\Job;
use think\Db;
class DoJob extends Controller{


    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param $data 发布任务时自定义的数据
     * @return int
     */
    public function fire(Job $job,$data){
        F('aaaa',$data);//断点
        exit;
        //这里$data定义格式为:$data = [ 'type'=>1, 'data_id' => 123,'ts' => time()]
        if(empty($data)){
            return 0;
        }
        if(is_array($data) && isset($data['type'])){
            $type = $data['type'];
            if($type == 1){
                //执行发送邮件业务
                $isJobDone = $this->sendEmail($data['data_id']);
            }else{
                return 0;
            }
        }else{
            return 0;
        }
        if ($isJobDone) {
            // 如果任务执行成功,删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                $job->delete();
                // 也可以重新发布这个任务
                //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
            }
        }
    }
    
    //处理订单业务
    private function orderService($id){
       
    }
通过打印class Queue中发现实际任务路径为'app\\admin\\controller\\DoJob@fire',
不知道问题出在哪,求大神请教

最佳答案
评论( 相关
后面还有条评论,点击查看>>