oQueueJob = new QueueJob; $this->QueueRedis = QueueRedis::getInstance(); } public function fire(Job $job, $data) { //任务开始判断 $this->oQueueJob->init($job); // 获取 Redis 任务的原始数据 $rawBody = empty($job->getRawBody()) ? '' : $job->getRawBody(); $jobData = empty($rawBody) ? [] : json_decode($rawBody, true); $jobId = empty($jobData['id']) ? 'unknown' : $jobData['id']; $this->oQueueJob->log("-----------队列任务开始-----------"); $this->oQueueJob->log("当前任务ID: {$jobId}, 尝试次数: {$job->attempts()}"); // 获取文章ID $iArticleId = empty($data['article_id']) ? 0 : $data['article_id']; $sChunkIndex = empty($data['chunkIndex']) ? 0 : $data['chunkIndex']; $sPrompt = empty($data['prompt']) ? '' : $data['prompt']; if (empty($iArticleId)) { $this->oQueueJob->log("无效的article_id,删除任务"); $job->delete(); return; } try { // 生成Redis键并尝试获取锁 $sClassName = get_class($this); $sRedisKey = "queue_job:{$sClassName}:{$iArticleId}:{$sPrompt}_{$sChunkIndex}"; $sRedisValue = uniqid() . '_' . getmypid(); if (!$this->oQueueJob->acquireLock($sRedisKey, $sRedisValue, $job)) { return; // 未获取到锁,已处理 } //生成内容 $oAireview = new ProofRead; $response = $oAireview->proofReadQueue($data); // 验证API响应 if (empty($response)) { throw new \RuntimeException("OpenAI API返回空结果"); } // 检查JSON解析错误 $aResult = json_decode($response, true); echo '
';var_dump($aResult);
            if (json_last_error() !== JSON_ERROR_NONE) {
                throw new \RuntimeException("解析OpenAI响应失败: " . json_last_error_msg() . " | 原始响应: {$response}");
            }
            $sMsg = empty($aResult['msg']) ? 'success' : $aResult['msg'];
            //更新完成标识
            $this->QueueRedis->finishJob($sRedisKey, 'completed', $this->completedExprie,$sRedisValue);
            $job->delete();
            $this->oQueueJob->log("任务执行成功 | 日志ID: {$sRedisKey} | 执行日志:{$sMsg}");

        } catch (\RuntimeException $e) {
            $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue, $job);
        } catch (\LogicException $e) {
            $this->oQueueJob->handleNonRetryableException($e,$sRedisKey,$sRedisValue, $job);
        } catch (\Exception $e) {
            $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue, $job);
        } finally {
            $this->oQueueJob->finnal();
        }
    }
}