257 lines
7.8 KiB
Markdown
257 lines
7.8 KiB
Markdown
---
|
||
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创建
|
||
|