From b37a77f23f995758178b6af38b89a860107d218d Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期四, 25 三月 2021 16:45:29 +0800
Subject: [PATCH] 解决循环依赖导致的打包失败

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java |   67 +++++++++++++++++++++++++--------
 1 files changed, 50 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index 16698f9..e97629b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -4,11 +4,17 @@
 import java.text.ParseException;
 import java.util.*;
 
+import javax.sip.address.SipURI;
+
 import javax.sip.header.FromHeader;
 import javax.sip.header.HeaderAddress;
+import javax.sip.header.ToHeader;
 import javax.sip.InvalidArgumentException;
+import javax.sip.ListeningPoint;
+import javax.sip.ObjectInUseException;
 import javax.sip.RequestEvent;
 import javax.sip.SipException;
+import javax.sip.SipProvider;
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 
@@ -36,6 +42,7 @@
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce;
 
+import gov.nist.javax.sip.SipStackImpl;
 import gov.nist.javax.sip.address.AddressImpl;
 import gov.nist.javax.sip.address.SipUri;
 
@@ -286,24 +293,50 @@
 				deferredResultHolder.invokeResult(msg);
 			} else {
 				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护
-				if (XmlUtil.getText(rootElement, "TeleBoot").equals("Boot") && false) {	// 杩滅▼鍚姩鍔熻兘锛氶渶瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦
-					String platformId = ((SipUri) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-					logger.info("鎵ц杩滅▼鍚姩鍛戒护");
-					ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
-					cmderFroPlatform.unregister(parentPlatform, null, null);
-
-					Thread restartThread = new Thread(new Runnable() {
-						@Override
-						public void run() {
-							try {
-								Thread.sleep(1000);
-								VManageBootstrap.restart();
-							} catch (InterruptedException ignored) {
+				String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
+				String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
+				// 杩滅▼鍚姩鍔熻兘
+				if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement, "TeleBoot"))) {
+					if (deviceId.equals(targetGBId)) {
+						// 杩滅▼鍚姩鍔熻兘锛氶渶瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦
+						logger.info("鎵ц杩滅▼鍚姩鏈钩鍙板懡浠�");
+						ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
+						cmderFroPlatform.unregister(parentPlatform, null, null);
+	
+						Thread restartThread = new Thread(new Runnable() {
+							@Override
+							public void run() {
+								try {
+									Thread.sleep(3000);
+									SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
+									SipStackImpl stack = (SipStackImpl)up.getSipStack();
+									stack.stop();
+									Iterator listener = stack.getListeningPoints();
+									while (listener.hasNext()) {
+										stack.deleteListeningPoint((ListeningPoint) listener.next());
+									}
+									Iterator providers = stack.getSipProviders();
+									while (providers.hasNext()) {
+										stack.deleteSipProvider((SipProvider) providers.next());
+									}
+									VManageBootstrap.restart();
+								} catch (InterruptedException ignored) {
+								} catch (ObjectInUseException e) {
+									e.printStackTrace();
+								}
 							}
-						}
-					});
-					restartThread.setDaemon(false);
-					restartThread.start();
+						});
+			
+						restartThread.setDaemon(false);
+						restartThread.start();
+					} else {
+						// 杩滅▼鍚姩鎸囧畾璁惧
+					}
+				}
+				if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement,"PTZCmd")) && !deviceId.equals(targetGBId)) {
+					String cmdString = XmlUtil.getText(rootElement,"PTZCmd");
+					Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId);
+					cmder.fronEndCmd(device, deviceId, cmdString);
 				}
 			}
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {

--
Gitblit v1.8.0