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

257 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: ""
overview: ""
todos: []
isProject: false
---
# 诊断article.status_task异常和video_url未更新问题
## 问题描述
**问题1**提交饮食打卡记录时article表中的status_task字段保持为0或变成2而不是预期的1完成
**问题2**article表中的video_url字段始终为NULL即使视频已经生成完成
**关键信息**
- KieAI回调一般需要10秒以上才到达不会立即回调
- 两个问题有关联,都指向**KieAI回调没有正常执行或执行失败**
## 根因分析
### 核心问题KieAI回调未正常执行
根据分析,最可能的原因是:
**原因1回调反序列化失败**(最可能)
根据[修复kieai回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md)KieAI回调到达后端但Jackson反序列化失败
```
Could not resolve parameter [0]... Problem deserializing 'setterless' property 'resultUrls':
get method returned null
```
这导致:
1. `handleCallback` 方法无法执行
2. `handleTaskCallback` 中更新article的逻辑从未运行
3. `video_url``status_task` 字段保持未更新状态
**原因2回调URL配置错误**
- `kieAIConfig.getApiCallbackUrl()` 可能未配置或配置错误
- KieAI服务无法访问回调地址网络问题、防火墙等
- 回调地址格式不正确
**原因3回调数据格式问题**
- KieAI返回的数据结构与`KieAIQueryTaskResponse`不匹配
- `resultUrls`字段名称或格式异常
## 执行流程分析
### 预期流程(正常情况)
```mermaid
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
```
### 实际流程(异常情况)
```mermaid
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](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java)
**问题代码**TaskData类
```java
@Data
public static class TaskData implements Serializable {
@ApiModelProperty(value = "结果URL数组视频/图片地址)")
private java.util.List<String> resultUrls; // Lombok生成的setter可能被Jackson忽略
}
```
**修复方法**显式添加setter方法
```java
@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
```yaml
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](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java)的回调方法开头添加:
```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配置
2. 搜索:`deserializing``Jackson``Could not resolve`
- 找到:确认是反序列化问题
3. 查看article创建日志
```
文章新增成功, taskId: xxx
```
### 步骤3验证回调URL配置
1. 检查`application.yml`中的`kie-ai.api-callback-url`
2. 确认URL可从外网访问
3. 测试回调接口是否正常响应
### 步骤4验证修复效果
提交打卡后,检查数据库:
```sql
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回调反序列化问题计划](修复kieai回调反序列化问题_85d41db5.plan.md)Jackson反序列化失败导致回调处理方法无法执行。
### 修复优先级
1. **优先级1**:修复`KieAIQueryTaskResponse.TaskData`反序列化添加显式setter
2. **优先级2**验证回调URL配置
3. **优先级3**:添加详细日志
## 涉及文件
- [KieAIQueryTaskResponse.java](msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/response/kieai/KieAIQueryTaskResponse.java) - 主要修复
- [KieAIController.java](msh_crmeb_22/crmeb-front/src/main/java/com/zbkj/front/controller/KieAIController.java) - 回调入口
- [ToolKieAIServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolKieAIServiceImpl.java) - 回调处理
- [ToolSora2ServiceImpl.java](msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolSora2ServiceImpl.java) - article创建