taskId = $taskId; $this->onQueue('{GenerateGptImage2Pics}'); } /** * 执行任务 * * @param AIImageGenerationService $service * @return void */ public function handle(AIImageGenerationService $service) { // 本次 job 是否已正常结束;异常时不释放派发锁,交给队列重试或 failed() 释放 $finished = false; try { // 查找任务 $task = MpGeneratePicTask::find($this->taskId); if (!$task) { dLog('generate')->error('队列任务:找不到GPT-Image2图片生成任务', ['task_id' => $this->taskId]); logDB('generate', 'error', '队列任务:找不到GPT-Image2图片生成任务', ['task_id' => $this->taskId]); $finished = true; return; } // 检查任务状态,只处理pending状态的任务 if ($task->status !== MpGeneratePicTask::STATUS_PENDING) { dLog('generate')->info('队列任务:任务状态不是pending,跳过处理', [ 'task_id' => $this->taskId, 'status' => $task->status ]); $finished = true; return; } dLog('generate')->info('队列任务:开始处理GPT-Image2图片生成任务', ['task_id' => $this->taskId]); // 调用服务方法提交任务到GPT-Image2 API $service->submitTaskToGptImage2Api($task); dLog('generate')->info('队列任务:GPT-Image2图片生成任务处理完成', ['task_id' => $this->taskId]); $finished = true; } catch (\Exception $e) { dLog('generate')->error('队列任务:处理GPT-Image2图片生成任务失败', [ 'task_id' => $this->taskId, 'error' => $e->getMessage() ]); logDB('generate', 'error', '队列任务:处理GPT-Image2图片生成任务失败', [ 'task_id' => $this->taskId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); // 重新抛出异常,让队列系统处理重试;此处不释放派发锁, // 避免重试期间任务被重复派发,最终失败时由 failed() 释放 throw $e; } finally { if ($finished) { AIImageGenerationService::releaseTaskDispatchLock( AIImageGenerationService::DISPATCH_GROUP_GPT_IMAGE2, $this->taskId ); } } } /** * 任务失败时的处理 * * @param \Throwable $exception * @return void */ public function failed(\Throwable $exception) { dLog('generate')->error('队列任务:GPT-Image2图片生成任务最终失败', [ 'task_id' => $this->taskId, 'error' => $exception->getMessage() ]); logDB('generate', 'error', '队列任务:GPT-Image2图片生成任务最终失败', [ 'task_id' => $this->taskId, 'error' => $exception->getMessage(), 'attempts' => $this->attempts() ]); // 更新任务状态为失败 try { $task = MpGeneratePicTask::find($this->taskId); if ($task && $task->status === MpGeneratePicTask::STATUS_PENDING) { $task->updateStatus(MpGeneratePicTask::STATUS_FAILED, [ 'error_message' => '队列任务处理失败: ' . $exception->getMessage() ]); } } catch (\Exception $e) { dLog('generate')->error('队列任务:更新任务状态失败', [ 'task_id' => $this->taskId, 'error' => $e->getMessage() ]); } // 最终失败:释放派发锁,使任务在下一次扫描时可以重新派发 AIImageGenerationService::releaseTaskDispatchLock( AIImageGenerationService::DISPATCH_GROUP_GPT_IMAGE2, $this->taskId ); } }