648540858
2022-11-17 a53dce38c2f58c0bfd37203e46dc57aa56025f45
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package com.genersoft.iot.vmp.gb28181.transmit.callback;
 
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.async.DeferredResult;
 
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
 
/**    
 * @description: 异步请求处理
 * @author: swwheihei
 * @date:   2020年5月8日 下午7:59:05     
 */
@SuppressWarnings(value = {"rawtypes", "unchecked"})
@Component
public class DeferredResultHolder {
    
    public static final String CALLBACK_CMD_DEVICESTATUS = "CALLBACK_DEVICESTATUS";
    
    public static final String CALLBACK_CMD_DEVICEINFO = "CALLBACK_DEVICEINFO";
    
    public static final String CALLBACK_CMD_DEVICECONTROL = "CALLBACK_DEVICECONTROL";
    
    public static final String CALLBACK_CMD_DEVICECONFIG = "CALLBACK_DEVICECONFIG";
 
    public static final String CALLBACK_CMD_CONFIGDOWNLOAD = "CALLBACK_CONFIGDOWNLOAD";
    
    public static final String CALLBACK_CMD_CATALOG = "CALLBACK_CATALOG";
    
    public static final String CALLBACK_CMD_RECORDINFO = "CALLBACK_RECORDINFO";
 
    public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY";
 
    public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAYBACK";
 
    public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD";
 
    public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
 
    public static final String UPLOAD_FILE_CHANNEL = "UPLOAD_FILE_CHANNEL";
 
    public static final String CALLBACK_CMD_MOBILEPOSITION = "CALLBACK_MOBILEPOSITION";
 
    public static final String CALLBACK_CMD_PRESETQUERY = "CALLBACK_PRESETQUERY";
 
    public static final String CALLBACK_CMD_ALARM = "CALLBACK_ALARM";
 
    public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
 
    private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
 
 
    public void put(String key, String id, DeferredResultEx result) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(key);
        if (deferredResultMap == null) {
            deferredResultMap = new ConcurrentHashMap<>();
            map.put(key, deferredResultMap);
        }
        deferredResultMap.put(id, result);
    }
 
    public void put(String key, String id, DeferredResult result) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(key);
        if (deferredResultMap == null) {
            deferredResultMap = new ConcurrentHashMap<>();
            map.put(key, deferredResultMap);
        }
        deferredResultMap.put(id, new DeferredResultEx(result));
    }
    
    public DeferredResultEx get(String key, String id) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(key);
        if (deferredResultMap == null || ObjectUtils.isEmpty(id)) {
            return null;
        }
        return deferredResultMap.get(id);
    }
 
    public Collection<DeferredResultEx> getAllByKey(String key) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(key);
        if (deferredResultMap == null) {
            return null;
        }
        return deferredResultMap.values();
    }
 
    public boolean exist(String key, String id){
        if (key == null) {
            return false;
        }
        Map<String, DeferredResultEx> deferredResultMap = map.get(key);
        if (id == null) {
            return deferredResultMap != null;
        }else {
            return deferredResultMap != null && deferredResultMap.get(id) != null;
        }
    }
 
    /**
     * 释放单个请求
     * @param msg
     */
    public void invokeResult(RequestMessage msg) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
        if (deferredResultMap == null) {
            return;
        }
        DeferredResultEx result = deferredResultMap.get(msg.getId());
        if (result == null) {
            return;
        }
        result.getDeferredResult().setResult(msg.getData());
        deferredResultMap.remove(msg.getId());
        if (deferredResultMap.size() == 0) {
            map.remove(msg.getKey());
        }
    }
 
    /**
     * 释放所有的请求
     * @param msg
     */
    public void invokeAllResult(RequestMessage msg) {
        Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
        if (deferredResultMap == null) {
            return;
        }
        synchronized (this) {
            deferredResultMap = map.get(msg.getKey());
            if (deferredResultMap == null) {
                return;
            }
            Set<String> ids = deferredResultMap.keySet();
            for (String id : ids) {
                DeferredResultEx result = deferredResultMap.get(id);
                if (result == null) {
                    return;
                }
                if (result.getFilter() != null) {
                    Object handler = result.getFilter().handler(msg.getData());
                    result.getDeferredResult().setResult(handler);
                }else {
                    result.getDeferredResult().setResult(msg.getData());
                }
 
            }
            map.remove(msg.getKey());
        }
    }
}