liusuyi
2026-05-30 f4f4fc53260eb67483dce406a963628273786a61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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();
    }
}