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<String, StreamCallBack> 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();
|
}
|
}
|