Commit bc0319b3f338412aa18f73bd749057e9ea3a7125

Authored by 648540858
1 parent b6fa459b

将device信息写入redis以提高sip处理速度

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -318,7 +318,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -318,7 +318,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
318 318
319 } else { 319 } else {
320 // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备) 320 // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备)
321 - Device device = storager.queryVideoDevice(requesterId); 321 + Device device = redisCatchStorage.getDevice(requesterId);
322 if (device != null) { 322 if (device != null) {
323 logger.info("收到设备" + requesterId + "的语音广播Invite请求"); 323 logger.info("收到设备" + requesterId + "的语音广播Invite请求");
324 responseAck(evt, Response.TRYING); 324 responseAck(evt, Response.TRYING);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -112,7 +112,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -112,7 +112,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
112 MobilePosition mobilePosition = new MobilePosition(); 112 MobilePosition mobilePosition = new MobilePosition();
113 Element deviceIdElement = rootElement.element("DeviceID"); 113 Element deviceIdElement = rootElement.element("DeviceID");
114 String deviceId = deviceIdElement.getTextTrim().toString(); 114 String deviceId = deviceIdElement.getTextTrim().toString();
115 - Device device = storager.queryVideoDevice(deviceId); 115 + Device device = redisCatchStorage.getDevice(deviceId);
116 if (device != null) { 116 if (device != null) {
117 if (!StringUtils.isEmpty(device.getName())) { 117 if (!StringUtils.isEmpty(device.getName())) {
118 mobilePosition.setDeviceName(device.getName()); 118 mobilePosition.setDeviceName(device.getName());
@@ -168,7 +168,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -168,7 +168,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
168 Element deviceIdElement = rootElement.element("DeviceID"); 168 Element deviceIdElement = rootElement.element("DeviceID");
169 String deviceId = deviceIdElement.getText().toString(); 169 String deviceId = deviceIdElement.getText().toString();
170 170
171 - Device device = storager.queryVideoDevice(deviceId); 171 + Device device = redisCatchStorage.getDevice(deviceId);
172 if (device == null) { 172 if (device == null) {
173 return; 173 return;
174 } 174 }
@@ -235,7 +235,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -235,7 +235,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
235 String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader); 235 String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader);
236 236
237 Element rootElement = getRootElement(evt); 237 Element rootElement = getRootElement(evt);
238 - Device device = storager.queryVideoDevice(deviceId); 238 + Device device = redisCatchStorage.getDevice(deviceId);
239 if (device == null) { 239 if (device == null) {
240 return; 240 return;
241 } 241 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
10 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; 10 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
11 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 11 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
12 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 12 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
  13 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
13 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 14 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
14 import gov.nist.javax.sip.RequestEventExt; 15 import gov.nist.javax.sip.RequestEventExt;
15 import gov.nist.javax.sip.address.AddressImpl; 16 import gov.nist.javax.sip.address.AddressImpl;
@@ -52,6 +53,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -52,6 +53,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
52 private RegisterLogicHandler handler; 53 private RegisterLogicHandler handler;
53 54
54 @Autowired 55 @Autowired
  56 + private IRedisCatchStorage redisCatchStorage;
  57 +
  58 + @Autowired
55 private IVideoManagerStorager storager; 59 private IVideoManagerStorager storager;
56 60
57 @Autowired 61 @Autowired
@@ -86,7 +90,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -86,7 +90,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
86 AddressImpl address = (AddressImpl) fromHeader.getAddress(); 90 AddressImpl address = (AddressImpl) fromHeader.getAddress();
87 SipUri uri = (SipUri) address.getURI(); 91 SipUri uri = (SipUri) address.getURI();
88 String deviceId = uri.getUser(); 92 String deviceId = uri.getUser();
89 - Device device = storager.queryVideoDevice(deviceId); 93 + Device device = redisCatchStorage.getDevice(deviceId);
90 AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); 94 AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
91 // 校验密码是否正确 95 // 校验密码是否正确
92 if (authorhead != null) { 96 if (authorhead != null) {
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.SIPProcessorObserver; @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
8 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 8 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
  9 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
9 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 10 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
10 import org.dom4j.DocumentException; 11 import org.dom4j.DocumentException;
11 import org.dom4j.Element; 12 import org.dom4j.Element;
@@ -38,6 +39,9 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement @@ -38,6 +39,9 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
38 @Autowired 39 @Autowired
39 private IVideoManagerStorager storage; 40 private IVideoManagerStorager storage;
40 41
  42 + @Autowired
  43 + private IRedisCatchStorage redisCatchStorage;
  44 +
41 @Override 45 @Override
42 public void afterPropertiesSet() throws Exception { 46 public void afterPropertiesSet() throws Exception {
43 // 添加消息处理的订阅 47 // 添加消息处理的订阅
@@ -53,7 +57,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement @@ -53,7 +57,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
53 logger.debug("接收到消息:" + evt.getRequest()); 57 logger.debug("接收到消息:" + evt.getRequest());
54 String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); 58 String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
55 // 查询设备是否存在 59 // 查询设备是否存在
56 - Device device = storage.queryVideoDevice(deviceId); 60 + Device device = redisCatchStorage.getDevice(deviceId);
57 // 查询上级平台是否存在 61 // 查询上级平台是否存在
58 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); 62 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
59 try { 63 try {
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -467,7 +467,7 @@ public class ZLMHttpHookListener { @@ -467,7 +467,7 @@ public class ZLMHttpHookListener {
467 if (s.length == 2) { 467 if (s.length == 2) {
468 String deviceId = s[0]; 468 String deviceId = s[0];
469 String channelId = s[1]; 469 String channelId = s[1];
470 - Device device = storager.queryVideoDevice(deviceId); 470 + Device device = redisCatchStorage.getDevice(deviceId);
471 if (device != null) { 471 if (device != null) {
472 UUID uuid = UUID.randomUUID(); 472 UUID uuid = UUID.randomUUID();
473 SSRCInfo ssrcInfo; 473 SSRCInfo ssrcInfo;
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -63,4 +63,6 @@ public interface IStreamPushService { @@ -63,4 +63,6 @@ public interface IStreamPushService {
63 void zlmServerOffline(String mediaServerId); 63 void zlmServerOffline(String mediaServerId);
64 64
65 void clean(); 65 void clean();
  66 +
  67 + boolean saveToRandomGB();
66 } 68 }
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -96,7 +96,7 @@ public class PlayServiceImpl implements IPlayService { @@ -96,7 +96,7 @@ public class PlayServiceImpl implements IPlayService {
96 resultHolder.invokeResult(msg); 96 resultHolder.invokeResult(msg);
97 return playResult; 97 return playResult;
98 } 98 }
99 - Device device = storager.queryVideoDevice(deviceId); 99 + Device device = redisCatchStorage.getDevice(deviceId);
100 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); 100 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
101 playResult.setDevice(device); 101 playResult.setDevice(device);
102 // 超时处理 102 // 超时处理
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -255,4 +255,30 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -255,4 +255,30 @@ public class StreamPushServiceImpl implements IStreamPushService {
255 public void clean() { 255 public void clean() {
256 256
257 } 257 }
  258 +
  259 + @Override
  260 + public boolean saveToRandomGB() {
  261 + List<StreamPushItem> streamPushItems = streamPushMapper.selectAll();
  262 + long gbId = 100001;
  263 + for (StreamPushItem streamPushItem : streamPushItems) {
  264 + streamPushItem.setStreamType("push");
  265 + streamPushItem.setStatus(true);
  266 + streamPushItem.setGbId("34020000004111" + gbId);
  267 + gbId ++;
  268 + }
  269 + int limitCount = 30;
  270 +
  271 + if (streamPushItems.size() > limitCount) {
  272 + for (int i = 0; i < streamPushItems.size(); i += limitCount) {
  273 + int toIndex = i + limitCount;
  274 + if (i + limitCount > streamPushItems.size()) {
  275 + toIndex = streamPushItems.size();
  276 + }
  277 + gbStreamMapper.batchAdd(streamPushItems.subList(i, toIndex));
  278 + }
  279 + }else {
  280 + gbStreamMapper.batchAdd(streamPushItems);
  281 + }
  282 + return true;
  283 + }
258 } 284 }
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.storager; @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.storager;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
  5 +import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
6 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; 7 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
7 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; 8 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
@@ -169,4 +170,15 @@ public interface IRedisCatchStorage { @@ -169,4 +170,15 @@ public interface IRedisCatchStorage {
169 ThirdPartyGB queryMemberNoGBId(String queryKey); 170 ThirdPartyGB queryMemberNoGBId(String queryKey);
170 171
171 List<StreamInfo> getStreams(String mediaServerId, String pull); 172 List<StreamInfo> getStreams(String mediaServerId, String pull);
  173 +
  174 + /**
  175 + * 将device信息写入redis
  176 + * @param device
  177 + */
  178 + void updateDevice(Device device);
  179 +
  180 + /**
  181 + * 获取Device
  182 + */
  183 + Device getDevice(String deviceId);
172 } 184 }
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.storager.dao; @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.storager.dao;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  5 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
5 import org.apache.ibatis.annotations.*; 6 import org.apache.ibatis.annotations.*;
6 import org.springframework.stereotype.Repository; 7 import org.springframework.stereotype.Repository;
7 8
@@ -79,4 +80,17 @@ public interface GbStreamMapper { @@ -79,4 +80,17 @@ public interface GbStreamMapper {
79 "</foreach>" + 80 "</foreach>" +
80 "</script>") 81 "</script>")
81 void batchDel(List<StreamProxyItem> streamProxyItemList); 82 void batchDel(List<StreamProxyItem> streamProxyItemList);
  83 +
  84 + @Insert("<script> " +
  85 + "insert into gb_stream " +
  86 + "(app, stream, gbId, name, " +
  87 + "longitude, latitude, streamType, mediaServerId, status)" +
  88 + "values " +
  89 + "<foreach collection='subList' index='index' item='item' separator=','> " +
  90 + "('${item.app}', '${item.stream}', '${item.gbId}', '${item.name}', " +
  91 + "'${item.longitude}', '${item.latitude}', '${item.streamType}', " +
  92 + "'${item.mediaServerId}', ${item.status}) "+
  93 + "</foreach> " +
  94 + "</script>")
  95 + void batchAdd(List<StreamPushItem> subList);
82 } 96 }
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -377,4 +377,16 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -377,4 +377,16 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
377 } 377 }
378 return result; 378 return result;
379 } 379 }
  380 +
  381 + @Override
  382 + public void updateDevice(Device device) {
  383 + String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + device.getDeviceId();
  384 + redis.set(key, device);
  385 + }
  386 +
  387 + @Override
  388 + public Device getDevice(String deviceId) {
  389 + String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + deviceId;
  390 + return (Device)redis.get(key);
  391 + }
380 } 392 }
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -110,6 +110,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -110,6 +110,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
110 */ 110 */
111 @Override 111 @Override
112 public synchronized boolean create(Device device) { 112 public synchronized boolean create(Device device) {
  113 + redisCatchStorage.updateDevice(device);
113 return deviceMapper.add(device) > 0; 114 return deviceMapper.add(device) > 0;
114 } 115 }
115 116
@@ -128,11 +129,14 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -128,11 +129,14 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
128 Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId()); 129 Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
129 if (deviceByDeviceId == null) { 130 if (deviceByDeviceId == null) {
130 device.setCreateTime(now); 131 device.setCreateTime(now);
  132 + redisCatchStorage.updateDevice(device);
131 return deviceMapper.add(device) > 0; 133 return deviceMapper.add(device) > 0;
132 }else { 134 }else {
  135 + redisCatchStorage.updateDevice(device);
133 return deviceMapper.update(device) > 0; 136 return deviceMapper.update(device) > 0;
134 } 137 }
135 138
  139 +
136 } 140 }
137 141
138 @Override 142 @Override
@@ -185,11 +189,32 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -185,11 +189,32 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
185 } 189 }
186 } 190 }
187 } 191 }
  192 + int limitCount = 300;
188 if (addChannels.size() > 0) { 193 if (addChannels.size() > 0) {
189 - deviceChannelMapper.batchAdd(addChannels); 194 + if (addChannels.size() > limitCount) {
  195 + for (int i = 0; i < addChannels.size(); i += limitCount) {
  196 + int toIndex = i + limitCount;
  197 + if (i + limitCount > addChannels.size()) {
  198 + toIndex = addChannels.size();
  199 + }
  200 + deviceChannelMapper.batchAdd(addChannels.subList(i, toIndex));
  201 + }
  202 + }else {
  203 + deviceChannelMapper.batchAdd(addChannels);
  204 + }
190 } 205 }
191 if (updateChannels.size() > 0) { 206 if (updateChannels.size() > 0) {
192 - deviceChannelMapper.batchUpdate(updateChannels); 207 + if (updateChannels.size() > limitCount) {
  208 + for (int i = 0; i < updateChannels.size(); i += limitCount) {
  209 + int toIndex = i + limitCount;
  210 + if (i + limitCount > updateChannels.size()) {
  211 + toIndex = updateChannels.size();
  212 + }
  213 + deviceChannelMapper.batchAdd(updateChannels.subList(i, toIndex));
  214 + }
  215 + }else {
  216 + deviceChannelMapper.batchUpdate(updateChannels);
  217 + }
193 } 218 }
194 } 219 }
195 } 220 }
@@ -322,6 +347,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -322,6 +347,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
322 } 347 }
323 device.setOnline(1); 348 device.setOnline(1);
324 logger.info("更新设备在线: " + deviceId); 349 logger.info("更新设备在线: " + deviceId);
  350 + redisCatchStorage.updateDevice(device);
325 return deviceMapper.update(device) > 0; 351 return deviceMapper.update(device) > 0;
326 } 352 }
327 353
@@ -337,6 +363,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -337,6 +363,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
337 Device device = deviceMapper.getDeviceByDeviceId(deviceId); 363 Device device = deviceMapper.getDeviceByDeviceId(deviceId);
338 if (device == null) return false; 364 if (device == null) return false;
339 device.setOnline(0); 365 device.setOnline(0);
  366 + redisCatchStorage.updateDevice(device);
340 return deviceMapper.update(device) > 0; 367 return deviceMapper.update(device) > 0;
341 } 368 }
342 369