Files
msh-system/.cursor/plans/诊断article_status_task异常问题_6bd03fd4.plan.md

7.8 KiB
Raw Permalink Blame History

name, overview, todos, isProject
name overview todos isProject
false

诊断article.status_task异常和video_url未更新问题

问题描述

问题1提交饮食打卡记录时article表中的status_task字段保持为0或变成2而不是预期的1完成

问题2article表中的video_url字段始终为NULL即使视频已经生成完成

关键信息

  • KieAI回调一般需要10秒以上才到达不会立即回调
  • 两个问题有关联,都指向KieAI回调没有正常执行或执行失败

根因分析

核心问题KieAI回调未正常执行

根据分析,最可能的原因是:

原因1回调反序列化失败(最可能)

根据修复kieai回调反序列化问题计划KieAI回调到达后端但Jackson反序列化失败

Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls': 
get method returned null

这导致:

  1. handleCallback 方法无法执行
  2. handleTaskCallback 中更新article的逻辑从未运行
  3. video_urlstatus_task 字段保持未更新状态

原因2回调URL配置错误

  • kieAIConfig.getApiCallbackUrl() 可能未配置或配置错误
  • KieAI服务无法访问回调地址网络问题、防火墙等
  • 回调地址格式不正确

原因3回调数据格式问题

  • KieAI返回的数据结构与KieAIQueryTaskResponse不匹配
  • resultUrls字段名称或格式异常

执行流程分析

预期流程(正常情况)

sequenceDiagram
    participant Frontend as 前端
    participant Sora2 as ToolSora2ServiceImpl
    participant KieAI as KieAI服务
    participant Callback as KieAIController
    participant Service as ToolKieAIServiceImpl
    participant DB as 数据库

    Frontend->>Sora2: createImageToVideoTask
    Sora2->>KieAI: POST createTask含callBackUrl
    KieAI-->>Sora2: 返回taskId
    Sora2->>DB: INSERT article status_task=0
    Note over DB: status_task = 0
    
    Note over KieAI: 10秒以上视频生成中
    
    KieAI->>Callback: POST callback含resultUrls
    Callback->>Callback: 反序列化KieAIQueryTaskResponse
    Callback->>Service: handleTaskCallback
    Service->>DB: SELECT article WHERE task_id
    Service->>Service: extractVideoUrl
    Service->>DB: UPDATE video_url status_task=1
    Note over DB: video_url有值 status_task=1

实际流程(异常情况)

sequenceDiagram
    participant Frontend as 前端
    participant Sora2 as ToolSora2ServiceImpl
    participant KieAI as KieAI服务
    participant Callback as KieAIController
    participant DB as 数据库

    Frontend->>Sora2: createImageToVideoTask
    Sora2->>KieAI: POST createTask
    KieAI-->>Sora2: 返回taskId
    Sora2->>DB: INSERT article status_task=0
    Note over DB: status_task = 0
    
    Note over KieAI: 10秒以上...
    
    KieAI->>Callback: POST callback
    Callback--xCallback: 反序列化失败
    Note over Callback: Jackson报错setterless property resultUrls
    Note over DB: video_url仍为NULL status_task仍为0
    
    Note over Frontend,DB: 回调处理逻辑从未执行数据库未更新

解决方案

方案1修复回调反序列化问题主要修复

文件KieAIQueryTaskResponse.java

问题代码TaskData类

@Data
public static class TaskData implements Serializable {
    @ApiModelProperty(value = "结果URL数组视频/图片地址)")
    private java.util.List<String> resultUrls;  // Lombok生成的setter可能被Jackson忽略
}

修复方法显式添加setter方法

@Data
public static class TaskData implements Serializable {
    @ApiModelProperty(value = "结果URL数组视频/图片地址)")
    private java.util.List<String> resultUrls;
    
    // 显式添加setter以确保Jackson反序列化正常
    public void setResultUrls(java.util.List<String> resultUrls) {
        this.resultUrls = resultUrls;
    }
}

方案2验证回调URL配置

检查配置文件application.yml或application.properties

kie-ai:
  api-callback-url: http://your-domain.com/api/front/kieai/callback

验证要点

  1. URL必须是KieAI服务可访问的公网地址
  2. 确保没有防火墙阻止
  3. 路径正确:/api/front/kieai/callback

方案3添加详细日志辅助调试

KieAIController.java的回调方法开头添加:

@PostMapping("/callback")
public KieAINanoBananaResponse<String> handleCallback(
        @RequestBody KieAIQueryTaskResponse callbackData) {
    try {
        logger.info("======== KieAI回调原始数据 ========");
        logger.info("完整对象: {}", JSON.toJSONString(callbackData));
        logger.info("taskId: {}", callbackData.getTaskId());
        logger.info("state: {}", callbackData.getState());
        logger.info("resultUrls: {}", callbackData.getResultUrls());
        
        String taskId = callbackData.getTaskId();
        logger.info("接收KieAI任务回调任务ID: {}", taskId);
        toolKieAIService.handleTaskCallback(taskId, callbackData);
        return KieAINanoBananaResponse.success("回调处理成功");
    } catch (Exception e) {
        logger.error("处理任务回调失败", e);
        return KieAINanoBananaResponse.fail("回调处理失败");
    }
}

诊断和修复步骤

步骤1修复反序列化问题优先级最高

  1. 修改KieAIQueryTaskResponse.java中的TaskData显式添加setter
  2. 重启后端服务
  3. 提交一次打卡测试

步骤2检查后端日志

如果回调仍未执行,检查日志:

  1. 搜索:接收KieAI任务回调
  • 找到:回调到达了,检查反序列化错误
  • 没找到回调未到达检查回调URL配置
  1. 搜索:deserializingJacksonCould not resolve
  • 找到:确认是反序列化问题
  1. 查看article创建日志
 文章新增成功, taskId: xxx

步骤3验证回调URL配置

  1. 检查application.yml中的kie-ai.api-callback-url
  2. 确认URL可从外网访问
  3. 测试回调接口是否正常响应

步骤4验证修复效果

提交打卡后,检查数据库:

SELECT id, task_id, video_url, status_task, create_time, update_time 
FROM eb_article 
WHERE task_id = 'your_task_id'
ORDER BY create_time DESC 
LIMIT 1;

预期结果

  • status_task = 1(任务完成)
  • video_url 有值
  • update_time 在create_time的10秒以上后更新

问题总结

核心原因

KieAI回调无法被正确处理导致

  1. video_url未更新始终为NULL
  2. status_task未更新保持为0

最可能的原因

根据修复kieai回调反序列化问题计划Jackson反序列化失败导致回调处理方法无法执行。

修复优先级

  1. 优先级1:修复KieAIQueryTaskResponse.TaskData反序列化添加显式setter
  2. 优先级2验证回调URL配置
  3. 优先级3:添加详细日志

涉及文件