TP6扩展think-queue & redis处理订单超时后更新订单状态,回滚商品数据

一、安装扩展:composer require topthink/think-queue

	注:tp6对应的think-queue版本为3.0以上,不然队列监听启动不了(会报错)

二、配置redis连接(redis自行下载安装,这里用phpstudy来配置redis)

	1.在项目目录下vendor/topthink/think-queue/config.php内容复制到config/queue.php(没有queue.php文件自行创建);
	return [
		    'default'     => 'redis',
		    'connections' => [
		        'sync'     => [
		            'type' => 'sync',
		        ],
	        'redis'    => [
	            'type'       => 'redis',
	            'queue'      => 'default',
	            'host'       => '127.0.0.1',
	            'port'       => 6379,
	            'password'   => '',
	            'select'     => 0,
	            'timeout'    => 0,
	            'persistent' => false,
	        ],
	],
	    'failed'      => [
	        'type'  => 'none',
	        'table' => 'failed_jobs',
	    ],
	];

在这里插入图片描述

三 、创建消费者控制器(所谓的消费者就是删除队列更新数据的操作:先进后出)

	1.app/job/TimeoutOrder.php 创建消费者控制器 TimeoutOrder切不用就继承任何基类
	消费者:
	class TimeoutOrder
{
    /**
     * 队列消费者入口
     * @param Job $job
     * @param $data
     * @return void
     */
    public function fire(Job $job, $data)
    {
        $result = $this->toJob($data);
        if ($result) {
            $job->delete(); // 删除该任务
        } else {
            $job->release(2);
        }
    }

    /**
     * 订单超时 数据恢复
     * @param $data
     * @return bool
     */
    public function toJob($data)
    {
        // 更新商品订单状态
        Db::startTrans();
        try {
          // 1.代码逻辑
     
        if ($result["code"] == 1) {
            echo "执行成功";
            Log::write('TimeoutOrder执行成功了');
            return true;
        } else {
            echo "执行失败";
            Log::write('TimeoutOrder执行失败了');
            return false;
        }
    }

    public function failed($data)
    {
        // ...任务达到最大重试次数后,失败了
    }

}
	

在这里插入图片描述

四、生产者:在订单生成时就将该订单信息添加到redis有序队列中

  // 队列生产者  订单超时监听队列
                        $consumer_time = 1800; // 半个小时,1800秒
                        $jobHandlerClassName = 'app\job\TimeoutOrder'; // 消费者路径
                        $jobData = ['order_id'=>$orderResult->id]; // 订单ID,这里可以放自己想放的数据
                        $jobQueueName = 'order_timeout'; // 队列名称
                        $result = Queue::later($consumer_time, $jobHandlerClassName, $jobData, $jobQueueName);//参数1:时间,,参数2:路径,参数3:业务参数,参数4:队列名称
                        if ($result === false) { // 加入队列失败
                          
                        }

五、在终端开启队列监听

	1.php think queue:listen --queue // 监听所有队列
	2.php think queue:listen --queue order_timeout // 监听指定队列+队列名称

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值