From 3b21f385cdae7d94fce1ebba6abb06a893f57114 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 02 十一月 2021 10:40:29 +0800
Subject: [PATCH] 对需要向设备发起请求的http请求,使用缓存,等待设备请求返回的时候一次性释放所有请求

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java |   66 +++++++++++++++++++++++++++++---
 1 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
index e6a7e41..ecfa666 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -1,6 +1,8 @@
 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;
@@ -45,22 +47,72 @@
 
 	public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
 
-	private Map<String, DeferredResult> map = new ConcurrentHashMap<String, DeferredResult>();
+	private Map<String, Map<String, DeferredResult>> map = new ConcurrentHashMap<>();
 
 
-	public void put(String key, DeferredResult result) {
-		map.put(key, result);
+	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) {
-		return map.get(key);
+	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) {
-		DeferredResult result = map.get(msg.getId());
+		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());
+
 	}
 }

--
Gitblit v1.8.0