修复:截图降级路径持久化cos_key,解决"无持久化记录"导致图片损坏

回调超时走Redis降级时,之前只写了缓存没有持久化cos_key到DB,
导致后续proxyImage查DB返回null显示损坏图片。
提取persistCosKey()方法供回调和降级路径共用。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 09:40:51 +08:00
parent 8f17ba9005
commit 5cfac62421

View File

@@ -156,9 +156,12 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService {
JSONObject res = JSON.parseObject(resultJson);
result.put("status", res.getString("status"));
if ("ok".equals(res.getString("status"))) {
result.put("url", res.getString("url"));
String url = res.getString("url");
result.put("url", url);
// 降级成功,写入缓存
writeCache(cameraCode, res.getString("url"));
writeCache(cameraCode, url);
// 降级路径也要持久化 cos_key 到 DB否则后续 proxyImage 会找不到记录
persistCosKey(cameraCode, url, requestId);
} else {
result.put("message", res.getString("message"));
}
@@ -209,26 +212,7 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService {
if ("ok".equals(status) && cameraCode != null) {
String url = (String) data.get("url");
writeCache(cameraCode, url);
// 从URL解析cos_key优先失败时降级使用pendingCosKeys
String cosKey = extractCosKeyFromUrl(url);
if (cosKey == null) {
cosKey = pendingCosKeys.remove(requestId);
} else {
// 解析成功也要清理pendingCosKeys避免内存泄漏
pendingCosKeys.remove(requestId);
}
if (cosKey != null) {
try {
snapshotMapper.upsert(cameraCode, cosKey);
log.info("[AI截图] cos_key 已持久化: cameraCode={}, cosKey={}", cameraCode, cosKey);
} catch (Exception e) {
log.error("[AI截图] 持久化 cos_key 失败: cameraCode={}, error={}", cameraCode, e.getMessage());
}
} else {
log.warn("[AI截图] 无法获取cos_key: cameraCode={}, url={}", cameraCode, url);
}
persistCosKey(cameraCode, url, requestId);
} else {
pendingCosKeys.remove(requestId);
}
@@ -284,6 +268,30 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService {
return null;
}
/**
* 持久化 cos_key 到 DB从 URL 解析或从 pendingCosKeys 获取)
* 供降级路径和回调路径共用
*/
private void persistCosKey(String cameraCode, String url, String requestId) {
String cosKey = extractCosKeyFromUrl(url);
if (cosKey == null) {
cosKey = pendingCosKeys.remove(requestId);
} else {
pendingCosKeys.remove(requestId);
}
if (cosKey != null) {
try {
snapshotMapper.upsert(cameraCode, cosKey);
log.info("[AI截图] cos_key 已持久化(降级路径): cameraCode={}, cosKey={}", cameraCode, cosKey);
} catch (Exception e) {
log.error("[AI截图] 持久化 cos_key 失败(降级路径): cameraCode={}, error={}", cameraCode, e.getMessage());
}
} else {
log.warn("[AI截图] 降级路径无法获取cos_key: cameraCode={}, url={}", cameraCode, url);
}
}
/**
* 写入截图缓存
*/