fix: 修复大文件解析后,状态丢失bug

This commit is contained in:
wenjinbo 2025-09-25 14:58:52 +08:00
parent fe51278f14
commit 1f6fdec804
4 changed files with 39 additions and 11 deletions

View File

@ -15,7 +15,7 @@ public final class DifyConstants {
public static final String PDF_TASK_REDIS_KEY = "pdf:conversion:tasks";
public static final String PDF_TASK_LIST_SUFFIX = ":list";
public static final int REDIS_EXPIRE_HOURS = 24;
public static final int PDF_TASK_EXPIRE_MINUTES = 10; // PDF转换任务10分钟超时
public static final int PDF_TASK_EXPIRE_MINUTES = 120; // PDF转换任务2小时超时Redis存储时间
// ======== 文件类型常量 ========
public static final String FILE_TYPE_DOC = "doc";

View File

@ -77,6 +77,7 @@ public class PdfConversionServiceImpl implements PdfConversionService {
logger.info("PDF转换任务已提交任务ID: {}, 文件名: {}", taskId, file.getOriginalFilename());
// 构建响应
//id a4a21249410643f0bc31bdeb2de5dc92
} catch (Exception e) {
@ -121,7 +122,7 @@ public class PdfConversionServiceImpl implements PdfConversionService {
logger.info("PDF转换服务调用成功: taskId {}", taskId);
} catch (Exception e) {
logger.error("调用PDF转换服务失败: {}", e.getMessage(), e);
logger.error("调用PDF转换服务失败: {} 文件名:{}", e.getMessage(),file.getOriginalFilename());
throw new DifyServiceException("调用PDF转换服务失败: " + e.getMessage(), e);
}
return taskId;
@ -132,18 +133,26 @@ public class PdfConversionServiceImpl implements PdfConversionService {
try {
// 使用Hash结构存储key为任务IDvalue为任务信息
String hashKey = DifyConstants.PDF_TASK_REDIS_KEY + ":" + pdfTask.getTaskId();
logger.info("开始存储PDF任务到Rediskey: {}, 任务ID: {}", hashKey, pdfTask.getTaskId());
redisTemplate.opsForHash().put(hashKey, "taskInfo", pdfTask);
// 设置过期时间10分钟
redisTemplate.expire(hashKey, DifyConstants.PDF_TASK_EXPIRE_MINUTES, TimeUnit.MINUTES);
// 设置过期时间2小时
Boolean expireResult = redisTemplate.expire(hashKey, DifyConstants.PDF_TASK_EXPIRE_MINUTES, TimeUnit.MINUTES);
logger.info("设置Redis key过期时间: {} 分钟,结果: {}", DifyConstants.PDF_TASK_EXPIRE_MINUTES, expireResult);
// 同时将任务ID加入到任务列表中便于定时任务扫描
redisTemplate.opsForList().rightPush(
DifyConstants.PDF_TASK_REDIS_KEY + DifyConstants.PDF_TASK_LIST_SUFFIX,
pdfTask.getTaskId()
);
String listKey = DifyConstants.PDF_TASK_REDIS_KEY + DifyConstants.PDF_TASK_LIST_SUFFIX;
Long listSize = redisTemplate.opsForList().rightPush(listKey, pdfTask.getTaskId());
logger.info("任务ID已加入列表列表key: {}, 当前列表大小: {}", listKey, listSize);
logger.info("PDF任务信息已存储到Redis: {}", pdfTask);
// 验证存储是否成功
Boolean keyExists = redisTemplate.hasKey(hashKey);
Long ttl = redisTemplate.getExpire(hashKey);
logger.info("存储验证 - key存在: {}, TTL: {} 秒", keyExists, ttl);
logger.info("PDF任务信息已成功存储到Redis: taskId={}, fileName={}",
pdfTask.getTaskId(), pdfTask.getName());
} catch (Exception e) {
logger.error("存储PDF任务信息到Redis失败: {}", e.getMessage(), e);

View File

@ -47,10 +47,29 @@ public class PdfConversionResultListener implements MessageListener {
// 从Redis获取任务信息
String hashKey = PDF_TASK_REDIS_KEY + ":" + taskId;
logger.debug("正在查询Redis key: {}", hashKey);
// 先检查key是否存在
Boolean keyExists = redisTemplate.hasKey(hashKey);
logger.debug("Redis key {} 是否存在: {}", hashKey, keyExists);
if (keyExists) {
// 检查key的TTL
Long ttl = redisTemplate.getExpire(hashKey);
logger.debug("Redis key {} 的TTL: {} 秒", hashKey, ttl);
}
PdfTaskDto taskInfo = (PdfTaskDto) redisTemplate.opsForHash().get(hashKey, "taskInfo");
if (taskInfo == null) {
logger.warn("任务{}的信息在Redis中不存在可能已被清理", taskId);
logger.warn("任务{}的信息在Redis中不存在可能已被清理。Redis key: {}, key存在: {}",
taskId, hashKey, keyExists);
// 检查任务列表中是否还有这个任务ID
String listKey = PDF_TASK_REDIS_KEY + ":list";
//Long position = redisTemplate.opsForList().indexOf(listKey, taskId);
//logger.warn("任务{}在任务列表{}中的位置", taskId, listKey);
return;
}

View File

@ -65,7 +65,7 @@ public class PdfConversionTaskService {
private static final String DEEP_ANALYSIS_PROCESSING = "deep_analysis:processing";
// PDF任务超时时间毫秒
private static final long PDF_TASK_TIMEOUT_MS = 1 * 60 * 60 * 1000; // 1小时
private static final long PDF_TASK_TIMEOUT_MS = 2 * 60 * 60 * 1000; // 2小时与Redis过期时间保持一致
/**
* 处理成功完成的任务