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