侧边栏壁纸
博主昵称
梦之中小俊

以前高中时,羡慕大学考试只要及格就行;现在大学了,怀念高中考试及不及格都行??

PHP

thinkphp Redis 消息队列 抢单 支付报错处理 demo

梦之中小俊
2023-05-13 / 0 评论 / 344 阅读 / 推送成功!
redis = new Redis();
        $this->redis->connect($config['host'], $config['port']);
        if (!empty($config['password'])) {
            $this->redis->auth($config['password']);
        }
        $this->redis->select($config['select']);

        // 初始化消息队列
        $this->queue = Queue::instance(config('queue'));
    }

    public function push()
    {
        // 生成一个新的订单
        $orderId = uniqid();
        $userId = rand(1, 100);
        $amount = rand(10, 100);

        // 将订单信息推入消息队列
        $data = [
            'order_id' => $orderId,
            'user_id' => $userId,
            'amount' => $amount,
        ];
        $this->redis->lPush($this->queueName, json_encode($data));
        echo "成功把订单ID为 {$orderId} 的订单推入队列中\n";
    }

    public function run()
    {
        // 从队列中获取订单信息并进行处理
        $jsonData = $this->redis->rPop($this->queueName);
        if (empty($jsonData)) {
            echo "队列中没有需要处理的订单\n";
            return;
        }

        $data = json_decode($jsonData, true);

        if (!is_array($data) || !isset($data['order_id']) || !isset($data['user_id']) || !isset($data['amount'])) {
            echo "无效的订单信息:$jsonData\n";
            return;
        }

        // 尝试处理订单并支付
        try {
            $result = $this->processOrder($data);
            if ($result) {
                echo "订单 ID 为 {$data['order_id']} 的订单处理成功\n";
            } else {
                throw new Exception("订单 ID 为 {$data['order_id']} 的订单支付失败");
            }
        } catch (Exception $e) {
            Log::error($e->getMessage());
            $data['attempts'] = intval($data['attempts'] ?? 0) + 1;
            if ($data['attempts'] < $this->maxAttempts) {
                // 重试
                $retryAt = time() + $this->retryAfter;
                $this->queue->later($retryAt, $data);  ////延时执行
                echo "订单 ID 为 {$data['order_id']} 的订单第 {$data['attempts']} 次处理失败,{$this->retryAfter} 秒后进行重试\n";
            } else {
                // 订单处理失败
                echo "订单 ID 为 {$data['order_id']} 的订单处理失败,已达到最大尝试次数\n";
            }
        }
    }

    private function processOrder(array $order)
    {
        // 处理订单并尝试支付
        echo "开始处理订单 ID 为 {$order['order_id']} 的订单\n";
        // 模拟处理订单和支付的过程,随机返回 true 或 false
        $success = boolval(rand(0, 1));
        if (!$success) {
            throw new Exception("支付失败");
        }
        return true;
    }
}
本文共 个字数,平均阅读时长 ≈ 分钟,您已阅读:0时0分0秒。
3

打赏

评论 (0)

OωO
  • ::(呵呵)
  • ::(哈哈)
  • ::(吐舌)
  • ::(太开心)
  • ::(笑眼)
  • ::(花心)
  • ::(小乖)
  • ::(乖)
  • ::(捂嘴笑)
  • ::(滑稽)
  • ::(你懂的)
  • ::(不高兴)
  • ::(怒)
  • ::(汗)
  • ::(黑线)
  • ::(泪)
  • ::(真棒)
  • ::(喷)
  • ::(惊哭)
  • ::(阴险)
  • ::(鄙视)
  • ::(酷)
  • ::(啊)
  • ::(狂汗)
  • ::(what)
  • ::(疑问)
  • ::(酸爽)
  • ::(呀咩爹)
  • ::(委屈)
  • ::(惊讶)
  • ::(睡觉)
  • ::(笑尿)
  • ::(挖鼻)
  • ::(吐)
  • ::(犀利)
  • ::(小红脸)
  • ::(懒得理)
  • ::(勉强)
  • ::(爱心)
  • ::(心碎)
  • ::(玫瑰)
  • ::(礼物)
  • ::(彩虹)
  • ::(太阳)
  • ::(星星月亮)
  • ::(钱币)
  • ::(茶杯)
  • ::(蛋糕)
  • ::(大拇指)
  • ::(胜利)
  • ::(haha)
  • ::(OK)
  • ::(沙发)
  • ::(手纸)
  • ::(香蕉)
  • ::(便便)
  • ::(药丸)
  • ::(红领巾)
  • ::(蜡烛)
  • ::(音乐)
  • ::(灯泡)
  • ::(开心)
  • ::(钱)
  • ::(咦)
  • ::(呼)
  • ::(冷)
  • ::(生气)
  • ::(弱)
  • ::(狗头)
泡泡
阿鲁
颜文字
取消
  1. 头像
    6767 Lv.1
    iPhone · Safari
    沙发

    画图

    回复
  2. 头像
    6767 Lv.1
    Windows 10 · Google Chrome
    板凳

    表情

    回复
  3. 头像
    透露 Lv.2
    Android · QQ Browser
    第30楼

    649494848

    回复