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

257 lines
7.8 KiB
Markdown
Raw Permalink Normal View History

---
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创建