diff --git a/application/api/job/SendReviewEmail.php b/application/api/job/SendReviewEmail.php index a140f98..11a1bb2 100644 --- a/application/api/job/SendReviewEmail.php +++ b/application/api/job/SendReviewEmail.php @@ -11,21 +11,14 @@ class SendReviewEmail private $oQueueJob; private $QueueRedis; private $maxRetries = 2; - private $logBuffer = []; - private $lastLogTime = 0; - private $logMaxSize = 1048576; // 1MB (1*1024*1024) - 修正注释与值匹配 private $lockExpire = 1800; private $completedExprie = 3600; const JSON_OPTIONS = JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR; public function __construct() { - $this->logPath = ROOT_PATH . 'public/queue_log/SendReviewEmail_' . date('Ymd') . '.log'; $this->oQueueJob = new QueueJob; $this->QueueRedis = QueueRedis::getInstance(); - $this->lastLogTime = time(); - // 确保日志目录存在 - $this->oQueueJob->ensureLogDirExists($this->logPath); } public function fire(Job $job, $data) @@ -33,16 +26,21 @@ class SendReviewEmail $startTime = microtime(true); $this->oQueueJob->log("-----------队列任务开始-----------"); + // 检查数据库连接 + if (!$this->oQueueJob->checkDbConnection(true)) { + $this->oQueueJob->log("数据库连接失败,无法执行任务,10秒后重试"); + $job->release(10); + return; + } + // 检查Redis连接状态 if (!$this->QueueRedis->getConnectionStatus()) { $this->oQueueJob->log("Redis连接失败,10秒后重试"); $job->release(10); - $this->oQueueJob->flushLog(); return; } // 获取文章ID - // 获取文章ID $iArticleId = empty($data['article_id']) ? 0 : $data['article_id']; //作者邮箱 $email = empty($data['email']) ? '' : $data['email']; @@ -62,8 +60,8 @@ class SendReviewEmail $reviewer_id = empty($data['reviewer_id']) ? 0 : $data['reviewer_id']; //邮件类型 $type = empty($data['type']) ? 1 : $data['type']; - if (empty($iArticleId)) { - $this->oQueueJob->log("无效的article_id,删除任务"); + if (empty($iArticleId) || empty($email)) { + $this->oQueueJob->log("无效的article_id/email,删除任务"); $job->delete(); return; } @@ -92,29 +90,15 @@ class SendReviewEmail $job->release($delay); } } - $this->oQueueJob->flushLog(); return; } - - $aParam = [ - 'job_id' => $sRedisKey, - 'job_class' => $sClassName, - 'status' => 0, - 'create_time' => time(), - 'params' => json_encode($data, self::JSON_OPTIONS) - ]; - - $iLogId = $this->oQueueJob->addLog($aParam); - if (!$iLogId) { - $this->oQueueJob->log("日志创建失败,释放锁并删除任务:".json_encode($data, self::JSON_OPTIONS)); - $this->QueueRedis->releaseRedisLock($sRedisKey, $sRedisValue); - $job->delete(); - $this->oQueueJob->flushLog(); - return; - } - try { + // 执行核心任务前再次检查连接 + $result = $this->oQueueJob->checkDbConnection(); + if (!$result) { + throw new \RuntimeException("数据库连接异常,无法执行核心任务"); + } //查询是否发送过邮件 $oReviewer = new Reviewer; if($type != 3){ @@ -137,27 +121,19 @@ class SendReviewEmail $iId = $oReviewer->addLog($aEmailLog); } //更新日志 - $this->oQueueJob->updateLog([ - 'log_id' => $iLogId, - 'status' => 1, - 'update_time' => time(), - 'error' => $sMsg - ]); - - $this->QueueRedis->finishJob($sRedisKey, 'completed', $this->completedExprie); + $this->QueueRedis->finishJob($sRedisKey, 'completed', $this->completedExprie,$sRedisValue); $job->delete(); - $this->oQueueJob->log("任务执行成功 | 日志ID: {$iLogId} | 执行日志:{$sMsg}"); + $this->oQueueJob->log("任务执行成功 | 日志ID: {$sRedisKey} | 执行日志:{$sMsg}"); } catch (\RuntimeException $e) { - $this->oQueueJob->handleRetryableException($e, $iLogId, $sRedisKey, $job); + $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue,$job); } catch (\LogicException $e) { - $this->oQueueJob->handleNonRetryableException($e, $iLogId, $sRedisKey, $job); + $this->oQueueJob->handleNonRetryableException($e,$sRedisKey,$sRedisValue,$job); } catch (\Exception $e) { - $this->oQueueJob->handleRetryableException($e, $iLogId, $sRedisKey, $job); + $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue,$job); } finally { $executionTime = microtime(true) - $startTime; $this->oQueueJob->log("任务执行完成,耗时: " . number_format($executionTime, 4) . "秒"); - $this->oQueueJob->flushLog(); gc_collect_cycles(); } }