From 5f096921985f0a79abe426396ceada42c841b03c Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 23 二月 2024 18:48:01 +0800
Subject: [PATCH] 添加统一回调管理

---
 src/main/java/com/genersoft/iot/vmp/gb28181/session/CommonSessionManager.java                       |   86 +++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java |    5 +-
 2 files changed, 88 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/CommonSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CommonSessionManager.java
new file mode 100755
index 0000000..2d8c7e1
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CommonSessionManager.java
@@ -0,0 +1,86 @@
+package com.genersoft.iot.vmp.gb28181.session;
+
+import com.genersoft.iot.vmp.common.CommonCallback;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 閫氱敤鍥炶皟绠$悊
+ */
+@Component
+public class CommonSessionManager {
+
+    public static Map<String, CommonSession> callbackMap = new ConcurrentHashMap<>();
+
+    /**
+     * 瀛樺偍鍥炶皟鐩稿叧鐨勪俊鎭�
+     */
+    class CommonSession{
+        public String session;
+        public long createTime;
+        public int timeout;
+
+        public CommonCallback<Object> callback;
+        public CommonCallback<String> timeoutCallback;
+    }
+
+    /**
+     * 娣诲姞鍥炶皟
+     * @param sessionId 鍞竴鏍囪瘑
+     * @param callback 鍥炶皟
+     * @param timeout 瓒呮椂鏃堕棿, 鍗曚綅鍒嗛挓
+     */
+    public void add(String sessionId, CommonCallback<Object> callback, CommonCallback<String> timeoutCallback,
+                    Integer timeout) {
+        CommonSession commonSession = new CommonSession();
+        commonSession.session = sessionId;
+        commonSession.callback = callback;
+        commonSession.createTime = System.currentTimeMillis();
+        if (timeoutCallback != null) {
+            commonSession.timeoutCallback = timeoutCallback;
+        }
+        if (timeout != null) {
+            commonSession.timeout = timeout;
+        }
+        callbackMap.put(sessionId, commonSession);
+    }
+
+    public void add(String sessionId, CommonCallback<Object> callback) {
+        add(sessionId, callback, null, 1);
+    }
+
+    public CommonCallback<Object> get(String sessionId, boolean destroy) {
+        CommonSession commonSession = callbackMap.get(sessionId);
+        if (destroy) {
+            callbackMap.remove(sessionId);
+        }
+        return commonSession.callback;
+    }
+
+    public CommonCallback<Object> get(String sessionId) {
+        return get(sessionId, false);
+    }
+
+    public void delete(String sessionID) {
+        callbackMap.remove(sessionID);
+    }
+
+    @Scheduled(fixedRate= 60)   //姣忓垎閽熸墽琛屼竴娆�
+    public void execute(){
+        Calendar cal = Calendar.getInstance();
+        cal.add(Calendar.MINUTE, -1);
+        for (String session : callbackMap.keySet()) {
+            if (callbackMap.get(session).createTime < cal.getTimeInMillis()) {
+                // 瓒呮椂
+                if (callbackMap.get(session).timeoutCallback != null) {
+                    callbackMap.get(session).timeoutCallback.run("timeout");
+                }
+                callbackMap.remove(session);
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
index d35c6a6..435f35f 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -6,7 +6,6 @@
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
@@ -38,7 +37,6 @@
 import javax.sip.header.FromHeader;
 import javax.sip.message.Response;
 import java.text.ParseException;
-import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
@@ -222,7 +220,6 @@
 					mobilePosition.getLongitude(), mobilePosition.getLatitude());
 			mobilePosition.setReportSource("Mobile Position");
 
-
 			// 鏇存柊device channel 鐨勭粡绾害
 			DeviceChannel deviceChannel = new DeviceChannel();
 			deviceChannel.setDeviceId(device.getDeviceId());
@@ -242,6 +239,8 @@
 			}
 
 			storager.updateChannelPosition(deviceChannel);
+			// 鍚戝叧鑱斾簡璇ラ�氶亾骞朵笖寮�鍚Щ鍔ㄤ綅缃闃呯殑涓婄骇骞冲彴鍙戦�佺Щ鍔ㄤ綅缃闃呮秷鎭�
+
 
 			// 鍙戦�乺edis娑堟伅銆� 閫氱煡浣嶇疆淇℃伅鐨勫彉鍖�
 			JSONObject jsonObject = new JSONObject();

--
Gitblit v1.8.0