From 5cfac624216521a8a82382664718cfc173c5d034 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Wed, 11 Mar 2026 09:40:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E9=99=8D=E7=BA=A7=E8=B7=AF=E5=BE=84=E6=8C=81=E4=B9=85=E5=8C=96?= =?UTF-8?q?cos=5Fkey=EF=BC=8C=E8=A7=A3=E5=86=B3"=E6=97=A0=E6=8C=81?= =?UTF-8?q?=E4=B9=85=E5=8C=96=E8=AE=B0=E5=BD=95"=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=8D=9F=E5=9D=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回调超时走Redis降级时,之前只写了缓存没有持久化cos_key到DB, 导致后续proxyImage查DB返回null显示损坏图片。 提取persistCosKey()方法供回调和降级路径共用。 Co-Authored-By: Claude Opus 4.6 --- .../service/impl/AiScreenshotServiceImpl.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java index 42e2cd489..8de97a5a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java @@ -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); + } + } + /** * 写入截图缓存 */