From bc0319b3f338412aa18f73bd749057e9ea3a7125 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 13 十二月 2021 17:20:23 +0800
Subject: [PATCH] 将device信息写入redis以提高sip处理速度
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 2
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java | 26 ++++++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java | 6 +
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 2
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 2
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 12 ++++
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 12 ++++
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java | 14 ++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java | 6 +-
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java | 6 +
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 31 +++++++++
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java | 2
12 files changed, 111 insertions(+), 10 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 2635a5f..aee414f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -318,7 +318,7 @@
} else {
// 闈炰笂绾у钩鍙拌姹傦紝鏌ヨ鏄惁璁惧璇锋眰锛堥�氬父涓烘帴鏀惰闊冲箍鎾殑璁惧锛�
- Device device = storager.queryVideoDevice(requesterId);
+ Device device = redisCatchStorage.getDevice(requesterId);
if (device != null) {
logger.info("鏀跺埌璁惧" + requesterId + "鐨勮闊冲箍鎾璉nvite璇锋眰");
responseAck(evt, Response.TRYING);
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 74b63c8..2e58d9d 100644
--- 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
@@ -112,7 +112,7 @@
MobilePosition mobilePosition = new MobilePosition();
Element deviceIdElement = rootElement.element("DeviceID");
String deviceId = deviceIdElement.getTextTrim().toString();
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
if (device != null) {
if (!StringUtils.isEmpty(device.getName())) {
mobilePosition.setDeviceName(device.getName());
@@ -168,7 +168,7 @@
Element deviceIdElement = rootElement.element("DeviceID");
String deviceId = deviceIdElement.getText().toString();
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
if (device == null) {
return;
}
@@ -235,7 +235,7 @@
String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader);
Element rootElement = getRootElement(evt);
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
if (device == null) {
return;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
index 3f14e23..053bf9a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -10,6 +10,7 @@
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import gov.nist.javax.sip.RequestEventExt;
import gov.nist.javax.sip.address.AddressImpl;
@@ -52,6 +53,9 @@
private RegisterLogicHandler handler;
@Autowired
+ private IRedisCatchStorage redisCatchStorage;
+
+ @Autowired
private IVideoManagerStorager storager;
@Autowired
@@ -86,7 +90,7 @@
AddressImpl address = (AddressImpl) fromHeader.getAddress();
SipUri uri = (SipUri) address.getURI();
String deviceId = uri.getUser();
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
// 鏍¢獙瀵嗙爜鏄惁姝g‘
if (authorhead != null) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
index 241ee68..0aab871 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
@@ -6,6 +6,7 @@
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.dom4j.DocumentException;
import org.dom4j.Element;
@@ -38,6 +39,9 @@
@Autowired
private IVideoManagerStorager storage;
+ @Autowired
+ private IRedisCatchStorage redisCatchStorage;
+
@Override
public void afterPropertiesSet() throws Exception {
// 娣诲姞娑堟伅澶勭悊鐨勮闃�
@@ -53,7 +57,7 @@
logger.debug("鎺ユ敹鍒版秷鎭細" + evt.getRequest());
String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
// 鏌ヨ璁惧鏄惁瀛樺湪
- Device device = storage.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
// 鏌ヨ涓婄骇骞冲彴鏄惁瀛樺湪
ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
try {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 8c1239e..7eac768 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -467,7 +467,7 @@
if (s.length == 2) {
String deviceId = s[0];
String channelId = s[1];
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
if (device != null) {
UUID uuid = UUID.randomUUID();
SSRCInfo ssrcInfo;
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
index d228a1a..06c8b73 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -63,4 +63,6 @@
void zlmServerOffline(String mediaServerId);
void clean();
+
+ boolean saveToRandomGB();
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 640e99a..dab637f 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -96,7 +96,7 @@
resultHolder.invokeResult(msg);
return playResult;
}
- Device device = storager.queryVideoDevice(deviceId);
+ Device device = redisCatchStorage.getDevice(deviceId);
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
playResult.setDevice(device);
// 瓒呮椂澶勭悊
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
index be34fae..ecbddc4 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -255,4 +255,30 @@
public void clean() {
}
+
+ @Override
+ public boolean saveToRandomGB() {
+ List<StreamPushItem> streamPushItems = streamPushMapper.selectAll();
+ long gbId = 100001;
+ for (StreamPushItem streamPushItem : streamPushItems) {
+ streamPushItem.setStreamType("push");
+ streamPushItem.setStatus(true);
+ streamPushItem.setGbId("34020000004111" + gbId);
+ gbId ++;
+ }
+ int limitCount = 30;
+
+ if (streamPushItems.size() > limitCount) {
+ for (int i = 0; i < streamPushItems.size(); i += limitCount) {
+ int toIndex = i + limitCount;
+ if (i + limitCount > streamPushItems.size()) {
+ toIndex = streamPushItems.size();
+ }
+ gbStreamMapper.batchAdd(streamPushItems.subList(i, toIndex));
+ }
+ }else {
+ gbStreamMapper.batchAdd(streamPushItems);
+ }
+ return true;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 4f240d8..c9ffb35 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
@@ -169,4 +170,15 @@
ThirdPartyGB queryMemberNoGBId(String queryKey);
List<StreamInfo> getStreams(String mediaServerId, String pull);
+
+ /**
+ * 灏哾evice淇℃伅鍐欏叆redis
+ * @param device
+ */
+ void updateDevice(Device device);
+
+ /**
+ * 鑾峰彇Device
+ */
+ Device getDevice(String deviceId);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
index 9757b13..ffbca9c 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -2,6 +2,7 @@
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
+import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -79,4 +80,17 @@
"</foreach>" +
"</script>")
void batchDel(List<StreamProxyItem> streamProxyItemList);
+
+ @Insert("<script> " +
+ "insert into gb_stream " +
+ "(app, stream, gbId, name, " +
+ "longitude, latitude, streamType, mediaServerId, status)" +
+ "values " +
+ "<foreach collection='subList' index='index' item='item' separator=','> " +
+ "('${item.app}', '${item.stream}', '${item.gbId}', '${item.name}', " +
+ "'${item.longitude}', '${item.latitude}', '${item.streamType}', " +
+ "'${item.mediaServerId}', ${item.status}) "+
+ "</foreach> " +
+ "</script>")
+ void batchAdd(List<StreamPushItem> subList);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index af9a206..bad2aae 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -377,4 +377,16 @@
}
return result;
}
+
+ @Override
+ public void updateDevice(Device device) {
+ String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + device.getDeviceId();
+ redis.set(key, device);
+ }
+
+ @Override
+ public Device getDevice(String deviceId) {
+ String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + deviceId;
+ return (Device)redis.get(key);
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
index b7454a8..f1a9f9a 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -110,6 +110,7 @@
*/
@Override
public synchronized boolean create(Device device) {
+ redisCatchStorage.updateDevice(device);
return deviceMapper.add(device) > 0;
}
@@ -128,10 +129,13 @@
Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
if (deviceByDeviceId == null) {
device.setCreateTime(now);
+ redisCatchStorage.updateDevice(device);
return deviceMapper.add(device) > 0;
}else {
+ redisCatchStorage.updateDevice(device);
return deviceMapper.update(device) > 0;
}
+
}
@@ -185,11 +189,32 @@
}
}
}
+ int limitCount = 300;
if (addChannels.size() > 0) {
- deviceChannelMapper.batchAdd(addChannels);
+ if (addChannels.size() > limitCount) {
+ for (int i = 0; i < addChannels.size(); i += limitCount) {
+ int toIndex = i + limitCount;
+ if (i + limitCount > addChannels.size()) {
+ toIndex = addChannels.size();
+ }
+ deviceChannelMapper.batchAdd(addChannels.subList(i, toIndex));
+ }
+ }else {
+ deviceChannelMapper.batchAdd(addChannels);
+ }
}
if (updateChannels.size() > 0) {
- deviceChannelMapper.batchUpdate(updateChannels);
+ if (updateChannels.size() > limitCount) {
+ for (int i = 0; i < updateChannels.size(); i += limitCount) {
+ int toIndex = i + limitCount;
+ if (i + limitCount > updateChannels.size()) {
+ toIndex = updateChannels.size();
+ }
+ deviceChannelMapper.batchAdd(updateChannels.subList(i, toIndex));
+ }
+ }else {
+ deviceChannelMapper.batchUpdate(updateChannels);
+ }
}
}
}
@@ -322,6 +347,7 @@
}
device.setOnline(1);
logger.info("鏇存柊璁惧鍦ㄧ嚎: " + deviceId);
+ redisCatchStorage.updateDevice(device);
return deviceMapper.update(device) > 0;
}
@@ -337,6 +363,7 @@
Device device = deviceMapper.getDeviceByDeviceId(deviceId);
if (device == null) return false;
device.setOnline(0);
+ redisCatchStorage.updateDevice(device);
return deviceMapper.update(device) > 0;
}
--
Gitblit v1.8.0