package com.ard.work.sdk.hb.cache; import com.ard.work.sdk.hb.service.StreamCallBack; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ConcurrentHashMap; /** * 相机回调缓存 * 核心:每个相机一个独立的StreamCallBack实例,避免串流 * * @author 刘苏义 * @date 2024/10/24 8:55 */ @Slf4j // 新增:添加日志,便于排查问题 public class HbRealCallbackCache { // 私有化构造方法,禁止实例化 private HbRealCallbackCache() { throw new UnsupportedOperationException("该类为静态工具类,禁止实例化!"); } private static final ConcurrentHashMap cache = new ConcurrentHashMap<>(); /** * 存储回调实例到缓存(原子操作,避免重复覆盖) * @param cameraId 相机ID * @param callback 回调实例 * @return 原缓存中的实例(如果有) */ public static StreamCallBack put(String cameraId, StreamCallBack callback) { if (cameraId == null || callback == null) { log.warn("相机ID或回调实例为空,跳过缓存存储"); return null; } StreamCallBack oldCallback = cache.put(cameraId, callback); if (oldCallback != null) { log.warn("相机[{}]已有回调实例,已被新实例覆盖", cameraId); } else { log.debug("相机[{}]回调实例已存入缓存", cameraId); } return oldCallback; } /** * 从缓存中获取回调实例 * @param cameraId 相机ID * @return 回调实例(无则返回null) */ public static StreamCallBack get(String cameraId) { if (cameraId == null) { return null; } return cache.get(cameraId); } /** * 删除缓存中的回调实例 * @param cameraId 相机ID * @return 被删除的实例(无则返回null) */ public static StreamCallBack remove(String cameraId) { if (cameraId == null) { return null; } StreamCallBack removed = cache.remove(cameraId); if (removed != null) { log.debug("相机[{}]回调实例已从缓存中移除", cameraId); } else { log.warn("相机[{}]缓存中无回调实例,移除失败", cameraId); } return removed; } // 新增:检查缓存中是否存在指定相机的回调实例 public static boolean contains(String cameraId) { return cameraId != null && cache.containsKey(cameraId); } // 新增:清空所有缓存(慎用,仅用于系统关闭/重置) public static void clearAll() { cache.clear(); log.info("已清空所有相机回调缓存"); } // 新增:获取缓存大小(监控用) public static int size() { return cache.size(); } }