package com.genersoft.iot.vmp.gb28181.transmit.callback;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Set;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.ResponseEntity;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.context.request.async.DeferredResult;
|
|
/**
|
* @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_STOP = "CALLBACK_STOP";
|
|
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, DeferredResult>> map = new ConcurrentHashMap<>();
|
|
|
public void put(String key, String id, DeferredResult result) {
|
Map<String, DeferredResult> deferredResultMap = map.get(key);
|
if (deferredResultMap == null) {
|
deferredResultMap = new ConcurrentHashMap<>();
|
map.put(key, deferredResultMap);
|
}
|
deferredResultMap.put(id, result);
|
}
|
|
public DeferredResult get(String key, String id) {
|
Map<String, DeferredResult> deferredResultMap = map.get(key);
|
if (deferredResultMap == null) return null;
|
return deferredResultMap.get(id);
|
}
|
|
public boolean exist(String key, String id){
|
if (key == null) return false;
|
Map<String, DeferredResult> 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, DeferredResult> deferredResultMap = map.get(msg.getKey());
|
if (deferredResultMap == null) {
|
return;
|
}
|
DeferredResult result = deferredResultMap.get(msg.getId());
|
if (result == null) {
|
return;
|
}
|
result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
|
deferredResultMap.remove(msg.getId());
|
if (deferredResultMap.size() == 0) {
|
map.remove(msg.getKey());
|
}
|
}
|
|
/**
|
* 释放所有的请求
|
* @param msg
|
*/
|
public void invokeAllResult(RequestMessage msg) {
|
Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
|
if (deferredResultMap == null) {
|
return;
|
}
|
Set<String> ids = deferredResultMap.keySet();
|
for (String id : ids) {
|
DeferredResult result = deferredResultMap.get(id);
|
if (result == null) {
|
return;
|
}
|
result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
|
}
|
map.remove(msg.getKey());
|
|
}
|
}
|