|
|
@@ -87,6 +87,7 @@ class RedisDuplicateChecker:
|
|
|
task_data = {
|
|
|
"callback_task_id": callback_task_id,
|
|
|
"created_at": datetime.now().isoformat(),
|
|
|
+ "used": False, # 标记任务是否已被使用启动审查
|
|
|
"file_info": serializable_file_info
|
|
|
}
|
|
|
|
|
|
@@ -121,6 +122,37 @@ class RedisDuplicateChecker:
|
|
|
except Exception as e:
|
|
|
logger.error(f"取消注册任务失败: {str(e)}")
|
|
|
|
|
|
+ async def is_valid_task_id(self, callback_task_id: str) -> bool:
|
|
|
+ """验证任务ID是否存在且未过期"""
|
|
|
+ try:
|
|
|
+ if self.use_redis:
|
|
|
+ # 遍历所有任务键,查找匹配的callback_task_id
|
|
|
+ keys = self.redis_client.keys("task:*")
|
|
|
+ for key in keys:
|
|
|
+ task_info = self.redis_client.get(key)
|
|
|
+ if task_info:
|
|
|
+ task_data = json.loads(task_info)
|
|
|
+ if task_data.get("callback_task_id") == callback_task_id:
|
|
|
+ created_at = datetime.fromisoformat(task_data['created_at'])
|
|
|
+ if datetime.now() - created_at < timedelta(minutes=2):
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ # 任务已过期,清理
|
|
|
+ self.redis_client.delete(key)
|
|
|
+ return False
|
|
|
+ else:
|
|
|
+ # 内存模式检查
|
|
|
+ for file_id, task_info in self.task_cache.items():
|
|
|
+ if task_info.get("callback_task_id") == callback_task_id:
|
|
|
+ created_at = datetime.fromisoformat(task_info['created_at'])
|
|
|
+ if datetime.now() - created_at < timedelta(minutes=2):
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"验证任务ID失败: {str(e)}")
|
|
|
+ return False
|
|
|
+
|
|
|
async def get_task_info(self, file_id: str) -> str:
|
|
|
"""获取任务信息"""
|
|
|
try:
|
|
|
@@ -158,4 +190,67 @@ class RedisDuplicateChecker:
|
|
|
logger.info(f"清理过期缓存: {len(expired_files)} 个文件")
|
|
|
|
|
|
except Exception as e:
|
|
|
- logger.error(f"清理过期缓存失败: {str(e)}")
|
|
|
+ logger.error(f"清理过期缓存失败: {str(e)}")
|
|
|
+
|
|
|
+ async def is_task_already_used(self, callback_task_id: str) -> bool:
|
|
|
+ """检查任务是否已经被使用启动审查"""
|
|
|
+ try:
|
|
|
+ if self.use_redis:
|
|
|
+ # 遍历所有任务键,查找匹配的callback_task_id
|
|
|
+ keys = self.redis_client.keys("task:*")
|
|
|
+ for key in keys:
|
|
|
+ task_info = self.redis_client.get(key)
|
|
|
+ if task_info:
|
|
|
+ task_data = json.loads(task_info)
|
|
|
+ if task_data.get("callback_task_id") == callback_task_id:
|
|
|
+ # 检查任务是否已被使用
|
|
|
+ if task_data.get("used", False):
|
|
|
+ logger.info(f"任务已被使用: {callback_task_id}")
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+ return False
|
|
|
+ else:
|
|
|
+ # 内存模式检查
|
|
|
+ for file_id, task_info in self.task_cache.items():
|
|
|
+ if task_info.get("callback_task_id") == callback_task_id:
|
|
|
+ if task_info.get("used", False):
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+ return False
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"检查任务使用状态失败: {str(e)}")
|
|
|
+ return False
|
|
|
+
|
|
|
+ async def mark_task_as_used(self, callback_task_id: str):
|
|
|
+ """标记任务为已使用"""
|
|
|
+ try:
|
|
|
+ if self.use_redis:
|
|
|
+ # 遍历所有任务键,查找匹配的callback_task_id
|
|
|
+ keys = self.redis_client.keys("task:*")
|
|
|
+ for key in keys:
|
|
|
+ task_info = self.redis_client.get(key)
|
|
|
+ if task_info:
|
|
|
+ task_data = json.loads(task_info)
|
|
|
+ if task_data.get("callback_task_id") == callback_task_id:
|
|
|
+ # 更新used字段为True
|
|
|
+ task_data["used"] = True
|
|
|
+ self.redis_client.setex(
|
|
|
+ key,
|
|
|
+ 3600, # 1小时
|
|
|
+ json.dumps(task_data, ensure_ascii=False)
|
|
|
+ )
|
|
|
+ logger.info(f"任务已标记为使用: {callback_task_id}")
|
|
|
+ return
|
|
|
+ else:
|
|
|
+ # 内存模式
|
|
|
+ for file_id, task_info in self.task_cache.items():
|
|
|
+ if task_info.get("callback_task_id") == callback_task_id:
|
|
|
+ task_info["used"] = True
|
|
|
+ logger.info(f"任务已标记为使用: {callback_task_id}")
|
|
|
+ return
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"标记任务使用状态失败: {str(e)}")
|