From a53dce38c2f58c0bfd37203e46dc57aa56025f45 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 17 十一月 2022 18:22:24 +0800
Subject: [PATCH] Merge pull request #673 from 648540858/wvp-28181-2.0-multi-network

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java |   75 ++++++++++++++++++++++++++-----------
 1 files changed, 52 insertions(+), 23 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 ba65581..a351445 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,14 +1,14 @@
 package com.genersoft.iot.vmp.gb28181.transmit.callback;
 
-import java.util.HashMap;
+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;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.async.DeferredResult;
 
 /**    
  * @description: 寮傛璇锋眰澶勭悊
@@ -51,31 +51,48 @@
 
 	public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
 
-	private Map<String, Map<String, DeferredResult>> map = new ConcurrentHashMap<>();
+	private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
 
 
-	public void put(String key, String id, DeferredResult result) {
-		Map<String, DeferredResult> deferredResultMap = map.get(key);
+	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 DeferredResult get(String key, String id) {
-		Map<String, DeferredResult> deferredResultMap = map.get(key);
+
+	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, DeferredResult> deferredResultMap = map.get(key);
+		Map<String, DeferredResultEx> deferredResultMap = map.get(key);
 		if (id == null) {
 			return deferredResultMap != null;
 		}else {
@@ -88,15 +105,15 @@
 	 * @param msg
 	 */
 	public void invokeResult(RequestMessage msg) {
-		Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
+		Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
 		if (deferredResultMap == null) {
 			return;
 		}
-		DeferredResult result = deferredResultMap.get(msg.getId());
+		DeferredResultEx result = deferredResultMap.get(msg.getId());
 		if (result == null) {
 			return;
 		}
-		result.setResult(msg.getData());
+		result.getDeferredResult().setResult(msg.getData());
 		deferredResultMap.remove(msg.getId());
 		if (deferredResultMap.size() == 0) {
 			map.remove(msg.getKey());
@@ -108,18 +125,30 @@
 	 * @param msg
 	 */
 	public void invokeAllResult(RequestMessage msg) {
-		Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
+		Map<String, DeferredResultEx> 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) {
+		synchronized (this) {
+			deferredResultMap = map.get(msg.getKey());
+			if (deferredResultMap == null) {
 				return;
 			}
-			result.setResult(msg.getData());
+			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());
 		}
-		map.remove(msg.getKey());
 	}
 }

--
Gitblit v1.8.0