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/request/impl/MessageRequestProcessor.java | 244 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 172 insertions(+), 72 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 6f38e56..51aa2df 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 @@ -5,9 +5,11 @@ import java.util.*; import javax.sip.*; +import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.FromHeader; +import javax.sip.header.Header; import javax.sip.header.HeaderAddress; import javax.sip.header.ToHeader; import javax.sip.message.Request; @@ -34,6 +36,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.utils.GpsUtil; +import com.genersoft.iot.vmp.utils.SipUtils; import com.genersoft.iot.vmp.utils.SpringBeanFactory; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; @@ -166,18 +169,21 @@ */ private void processMessageMobilePosition(RequestEvent evt) { try { - Element rootElement = getRootElement(evt); - MobilePosition mobilePosition = new MobilePosition(); - Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getTextTrim().toString(); + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); Device device = storager.queryVideoDevice(deviceId); - if (device != null) { - rootElement = getRootElement(evt, device.getCharset()); - if (!StringUtils.isEmpty(device.getName())) { - mobilePosition.setDeviceName(device.getName()); - } + if (device == null) { + logger.warn("澶勭悊MobilePosition绉诲姩浣嶇疆娑堟伅鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; } - mobilePosition.setDeviceId(XmlUtil.getText(rootElement, "DeviceID")); + Element rootElement = getRootElement(evt, device.getCharset()); + + MobilePosition mobilePosition = new MobilePosition(); + if (!StringUtils.isEmpty(device.getName())) { + mobilePosition.setDeviceName(device.getName()); + } + mobilePosition.setDeviceId(deviceId); + mobilePosition.setChannelId(XmlUtil.getText(rootElement, "DeviceID")); mobilePosition.setTime(XmlUtil.getText(rootElement, "Time")); mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude"))); mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude"))); @@ -221,11 +227,17 @@ */ private void processMessageDeviceStatus(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceStatus璁惧鐘舵�丮essage鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); String name = rootElement.getName(); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getText(); - Device device = storager.queryVideoDevice(deviceId); + String channelId = deviceIdElement.getText(); if (name.equalsIgnoreCase("Query")) { // 鍖哄垎鏄疪esponse鈥斺�旀煡璇㈠搷搴旓紝杩樻槸Query鈥斺�旀煡璇㈣姹� logger.info("鎺ユ敹鍒癉eviceStatus鏌ヨ娑堟伅"); FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); @@ -252,10 +264,9 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS); + msg.setKey(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId + channelId); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); if (offLineDetector.isOnline(deviceId)) { publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); @@ -276,8 +287,15 @@ */ private void processMessageDeviceControl(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceControl璁惧鐘舵�丮essage鏈壘鍒拌澶囦俊鎭�"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); //String result = XmlUtil.getText(rootElement, "Result"); // 鍥炲200 OK responseAck(evt); @@ -289,10 +307,10 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL); + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId; + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { // 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护 String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); @@ -338,8 +356,8 @@ // 浜戝彴/鍓嶇鎺у埗鍛戒护 if (!StringUtils.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); + Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId); + cmder.fronEndCmd(deviceForPlatform, deviceId, cmdString); } } } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { @@ -354,8 +372,16 @@ */ private void processMessageDeviceConfig(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceConfig璁惧鐘舵�丮essage娑堟伅鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); // 鍥炲200 OK responseAck(evt); if (rootElement.getName().equals("Response")) { @@ -365,11 +391,11 @@ if (logger.isDebugEnabled()) { logger.debug(json.toJSONString()); } + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId; RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG); + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { // 姝ゅ鏄笂绾у彂鍑虹殑DeviceConfig鎸囦护 } @@ -385,8 +411,17 @@ */ private void processMessageConfigDownload(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊ConfigDownload璁惧鐘舵�丮essage鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); + String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + deviceId + channelId; // 鍥炲200 OK responseAck(evt); if (rootElement.getName().equals("Response")) { @@ -397,10 +432,9 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD); + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { // 姝ゅ鏄笂绾у彂鍑虹殑DeviceConfig鎸囦护 } @@ -416,8 +450,17 @@ */ private void processMessagePresetQuery(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊PresetQuery棰勭疆浣嶅垪琛∕essage鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); + String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId + channelId; // 鍥炲200 OK responseAck(evt); if (rootElement.getName().equals("Response")) {// !StringUtils.isEmpty(result)) { @@ -428,10 +471,9 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY); + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { // 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护 } @@ -447,11 +489,19 @@ */ private void processMessageDeviceInfo(RequestEvent evt) { try { + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } Element rootElement = getRootElement(evt); String requestName = rootElement.getName(); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getTextTrim(); - Device device = storager.queryVideoDevice(deviceId); + String channelId = deviceIdElement.getTextTrim(); + String key = DeferredResultHolder.CALLBACK_CMD_DEVICEINFO + deviceId + channelId; if (device != null ) { rootElement = getRootElement(evt, device.getCharset()); } @@ -486,10 +536,9 @@ storager.updateDevice(device); RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICEINFO); + msg.setKey(key); msg.setData(device); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); // 鍥炲200 OK responseAck(evt); if (offLineDetector.isOnline(deviceId)) { @@ -508,12 +557,22 @@ */ private void processMessageCatalogList(RequestEvent evt) { try { + + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } + Element rootElement = getRootElement(evt); String name = rootElement.getName(); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getText(); + String channelId = deviceIdElement.getText(); Element deviceListElement = rootElement.element("DeviceList"); - + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); AddressImpl address = (AddressImpl) fromHeader.getAddress(); SipUri uri = (SipUri) address.getURI(); @@ -575,10 +634,6 @@ } else { - Device device = storager.queryVideoDevice(deviceId); - if (device == null) { - return; - } deviceListElement = getRootElement(evt, device.getCharset()).element("DeviceList"); Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); if (deviceListIterator != null) { @@ -668,10 +723,9 @@ } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG); + msg.setKey(key); msg.setData(device); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); // 鍥炲200 OK responseAck(evt); if (offLineDetector.isOnline(deviceId)) { @@ -691,16 +745,20 @@ */ private void processMessageAlarm(RequestEvent evt) { try { - Element rootElement = getRootElement(evt); + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊alarm璁惧鎶ヨ淇℃伅鏈壘鍒拌澶囦俊鎭�"); + response404Ack(evt); + return; + } + Element rootElement = getRootElement(evt, device.getCharset()); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getText().toString(); + String channelId = deviceIdElement.getText().toString(); + String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId + channelId; // 鍥炲200 OK responseAck(evt); - Device device = storager.queryVideoDevice(deviceId); - if (device == null) { - return; - } if (device.getCharset() != null) { rootElement = getRootElement(evt, device.getCharset()); } @@ -708,6 +766,7 @@ if (rootElement.getName().equals("Notify")) { // 澶勭悊鎶ヨ閫氱煡 DeviceAlarm deviceAlarm = new DeviceAlarm(); deviceAlarm.setDeviceId(deviceId); + deviceAlarm.setChannelId(channelId); deviceAlarm.setAlarmPriority(XmlUtil.getText(rootElement, "AlarmPriority")); deviceAlarm.setAlarmMethod(XmlUtil.getText(rootElement, "AlarmMethod")); deviceAlarm.setAlarmTime(XmlUtil.getText(rootElement, "AlarmTime")); @@ -761,10 +820,9 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_ALARM); + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); @@ -778,9 +836,13 @@ */ private void processMessageKeepAlive(RequestEvent evt) { try { - Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 Device device = storager.queryVideoDevice(deviceId); + + Element rootElement = getRootElement(evt); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); // 妫�鏌ヨ澶囨槸鍚﹀瓨鍦ㄥ苟鍦ㄧ嚎锛� 涓嶅湪绾垮垯璁剧疆涓哄湪绾� if (device != null ) { @@ -792,7 +854,9 @@ Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest()); ServerTransaction serverTransaction = getServerTransaction(evt); serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } // if (device != null && device.getOnline() == 1) { @@ -820,18 +884,29 @@ */ private void processMessageRecordInfo(RequestEvent evt) { try { + + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } + // 鍥炲200 OK responseAck(evt); String uuid = UUID.randomUUID().toString().replace("-", ""); RecordInfo recordInfo = new RecordInfo(); Element rootElement = getRootElement(evt); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getText().toString(); - Device device = storager.queryVideoDevice(deviceId); + String channelId = deviceIdElement.getText().toString(); + String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId; if (device != null ) { rootElement = getRootElement(evt, device.getCharset()); } recordInfo.setDeviceId(deviceId); + recordInfo.setChannelId(channelId); recordInfo.setName(XmlUtil.getText(rootElement, "Name")); if (XmlUtil.getText(rootElement, "SumNum")== null || XmlUtil.getText(rootElement, "SumNum") =="") { recordInfo.setSumNum(0); @@ -843,10 +918,9 @@ if (recordListElement == null || recordInfo.getSumNum() == 0) { logger.info("鏃犲綍鍍忔暟鎹�"); RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO); + msg.setKey(key); msg.setData(recordInfo); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { Iterator<Element> recordListIterator = recordListElement.elementIterator(); List<RecordItem> recordList = new ArrayList<RecordItem>(); @@ -945,10 +1019,20 @@ */ private void processMessageMediaStatus(RequestEvent evt){ try { + + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } + // 鍥炲200 OK responseAck(evt); Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); String NotifyType =XmlUtil.getText(rootElement, "NotifyType"); if (NotifyType.equals("121")){ logger.info("濯掍綋鎾斁瀹屾瘯锛岄�氱煡鍏虫祦"); @@ -970,8 +1054,19 @@ */ private void processMessageBroadcast(RequestEvent evt) { try { + + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); + // 鏌ヨ璁惧鏄惁瀛樺湪 + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + logger.warn("澶勭悊DeviceInfo璁惧淇℃伅Message鏃舵湭鎵惧埌璁惧淇℃伅"); + response404Ack(evt); + return; + } + Element rootElement = getRootElement(evt); - String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); + String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId + channelId; // 鍥炲200 OK responseAck(evt); if (rootElement.getName().equals("Response")) { @@ -982,10 +1077,9 @@ logger.debug(json.toJSONString()); } RequestMessage msg = new RequestMessage(); - msg.setDeviceId(deviceId); - msg.setType(DeferredResultHolder.CALLBACK_CMD_BROADCAST); + msg.setKey(key); msg.setData(json); - deferredResultHolder.invokeResult(msg); + deferredResultHolder.invokeAllResult(msg); } else { // 姝ゅ鏄笂绾у彂鍑虹殑Broadcast鎸囦护 } @@ -1006,7 +1100,9 @@ Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); ServerTransaction serverTransaction = getServerTransaction(evt); serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } /*** @@ -1020,7 +1116,9 @@ Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest()); ServerTransaction serverTransaction = getServerTransaction(evt); serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } private Element getRootElement(RequestEvent evt) throws DocumentException { @@ -1029,7 +1127,9 @@ } private Element getRootElement(RequestEvent evt, String charset) throws DocumentException { - if (charset == null) charset = "gb2312"; + if (charset == null) { + charset = "gb2312"; + } Request request = evt.getRequest(); SAXReader reader = new SAXReader(); reader.setEncoding(charset); -- Gitblit v1.8.0