修复:截图降级路径持久化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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入截图缓存
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user