Преглед на файлове

火山图片生成任务改成队列执行

lh преди 3 месеца
родител
ревизия
64e20d5f4c
променени са 2 файла, в които са добавени 142 реда и са изтрити 5 реда
  1. 135 0
      app/Jobs/ProcessVolcImageGenerationJob.php
  2. 7 5
      app/Services/AIGeneration/AIImageGenerationService.php

+ 135 - 0
app/Jobs/ProcessVolcImageGenerationJob.php

@@ -0,0 +1,135 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Models\MpGeneratePicTask;
+use App\Services\AIGeneration\AIImageGenerationService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class ProcessVolcImageGenerationJob implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    /**
+     * 任务最大尝试次数
+     *
+     * @var int
+     */
+    public $tries = 3;
+
+    /**
+     * 任务超时时间(秒)
+     *
+     * @var int
+     */
+    public $timeout = 300;
+
+    /**
+     * 任务ID
+     *
+     * @var int
+     */
+    protected $taskId;
+
+    /**
+     * 创建一个新的任务实例
+     *
+     * @param int $taskId
+     * @return void
+     */
+    public function __construct(int $taskId)
+    {
+        $this->taskId = $taskId;
+        $this->onQueue('{GenerateVolcPics}');
+    }
+
+    /**
+     * 执行任务
+     *
+     * @param AIImageGenerationService $service
+     * @return void
+     */
+    public function handle(AIImageGenerationService $service)
+    {
+        try {
+            // 查找任务
+            $task = MpGeneratePicTask::find($this->taskId);
+            
+            if (!$task) {
+                dLog('generate')->error('队列任务:找不到图片生成任务', ['task_id' => $this->taskId]);
+                logDB('generate', 'error', '队列任务:找不到图片生成任务', ['task_id' => $this->taskId]);
+                return;
+            }
+
+            // 检查任务状态,只处理pending状态的任务
+            if ($task->status !== MpGeneratePicTask::STATUS_PENDING) {
+                dLog('generate')->info('队列任务:任务状态不是pending,跳过处理', [
+                    'task_id' => $this->taskId,
+                    'status' => $task->status
+                ]);
+                return;
+            }
+
+            dLog('generate')->info('队列任务:开始处理火山API图片生成任务', ['task_id' => $this->taskId]);
+            logDB('generate', 'info', '队列任务:开始处理火山API图片生成', ['task_id' => $this->taskId]);
+
+            // 调用服务方法提交任务到火山API
+            $service->submitTaskToVolcApi($task);
+
+            dLog('generate')->info('队列任务:火山API图片生成任务处理完成', ['task_id' => $this->taskId]);
+            logDB('generate', 'info', '队列任务:火山API图片生成任务处理完成', ['task_id' => $this->taskId]);
+
+        } catch (\Exception $e) {
+            dLog('generate')->error('队列任务:处理火山API图片生成任务失败', [
+                'task_id' => $this->taskId,
+                'error' => $e->getMessage()
+            ]);
+            logDB('generate', 'error', '队列任务:处理火山API图片生成任务失败', [
+                'task_id' => $this->taskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+
+            // 重新抛出异常,让队列系统处理重试
+            throw $e;
+        }
+    }
+
+    /**
+     * 任务失败时的处理
+     *
+     * @param \Throwable $exception
+     * @return void
+     */
+    public function failed(\Throwable $exception)
+    {
+        dLog('generate')->error('队列任务:火山API图片生成任务最终失败', [
+            'task_id' => $this->taskId,
+            'error' => $exception->getMessage()
+        ]);
+        logDB('generate', 'error', '队列任务:火山API图片生成任务最终失败', [
+            '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()
+            ]);
+        }
+    }
+}

+ 7 - 5
app/Services/AIGeneration/AIImageGenerationService.php

@@ -221,7 +221,7 @@ class AIImageGenerationService
      * @param MpGeneratePicTask $task
      * @return void
      */
-    private function submitTaskToVolcApi(MpGeneratePicTask $task): void
+    public function submitTaskToVolcApi(MpGeneratePicTask $task): void
     {
         try {
             // 验证环境变量配置
@@ -540,7 +540,7 @@ class AIImageGenerationService
         dLog('generate')->info('更新图片状态ing');
         logDB('generate', 'info', '开始更新图片生成任务状态', []);
         
-        // 1. 处理火山API的pending任务(批量提交)
+        // 1. 处理火山API的pending任务(批量提交到队列
         $volcPendingTasks = MpGeneratePicTask::where('status', MpGeneratePicTask::STATUS_PENDING)
             ->whereIn('model', BaseConst::VOLC_PIC_MODELS)
             ->orderBy('created_at', 'asc')
@@ -548,9 +548,11 @@ class AIImageGenerationService
             ->get();
 
         foreach ($volcPendingTasks as $task) {
-            dLog('generate')->info('开始处理火山API任务: ' . $task->task_id);
-            logDB('generate', 'info', '开始处理火山API待处理任务', ['task_id' => $task->task_id]);
-            $this->submitTaskToVolcApi($task);
+            dLog('generate')->info('开始分发火山API任务到队列: ' . $task->task_id);
+            logDB('generate', 'info', '分发火山API任务到队列', ['task_id' => $task->task_id]);
+            
+            // 分发到队列
+            \App\Jobs\ProcessVolcImageGenerationJob::dispatch($task->id)->onConnection('redis');
         }
         
         // 2. 获取所有处理中的任务(仅即梦AI需要查询状态)