浏览代码

优化多wvp国标级联推流时缓存的清理

648540858 1 年之前
父节点
当前提交
e85cef4345

+ 8 - 5
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java

@@ -54,10 +54,7 @@ import javax.sip.header.CallIdHeader;
 import javax.sip.message.Response;
 import java.text.ParseException;
 import java.time.Instant;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.Vector;
+import java.util.*;
 
 /**
  * SIP命令类型: INVITE请求
@@ -589,7 +586,13 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
                     sendRtpItem.setOnlyAudio(false);
                     sendRtpItem.setStatus(0);
                     sendRtpItem.setSessionName(sessionName);
-
+                    // 清理可能存在的缓存避免用到旧的数据
+                    List<SendRtpItem> sendRtpItemList = redisCatchStorage.querySendRTPServer(platform.getServerGBId(), channelId, gbStream.getStream());
+                    if (!sendRtpItemList.isEmpty()) {
+                        for (SendRtpItem rtpItem : sendRtpItemList) {
+                            redisCatchStorage.deleteSendRTPServer(rtpItem);
+                        }
+                    }
                     if ("push".equals(gbStream.getStreamType())) {
                         sendRtpItem.setPlayType(InviteStreamType.PUSH);
                         if (streamPushItem != null) {

+ 4 - 0
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java

@@ -40,6 +40,8 @@ public interface IRedisCatchStorage {
 
     void updateSendRTPSever(SendRtpItem sendRtpItem);
 
+    List<SendRtpItem> querySendRTPServer(String platformGbId, String channelId, String streamId);
+
     /**
      * 查询RTP推送信息缓存
      * @param platformGbId
@@ -192,6 +194,8 @@ public interface IRedisCatchStorage {
 
     void addDiskInfo(List<Map<String, Object>> diskInfo);
 
+    void deleteSendRTPServer(SendRtpItem sendRtpItem);
+
     List<SendRtpItem> queryAllSendRTPServer();
 
     List<Device> getAllDevices();

+ 27 - 0
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java

@@ -152,6 +152,25 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
         redisTemplate.opsForValue().set(key, sendRtpItem);
     }
 
+    @Override
+    public List<SendRtpItem> querySendRTPServer(String platformGbId, String channelId, String streamId) {
+        String scanKey = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX
+                + userSetting.getServerId() + "_*_"
+                + platformGbId + "_"
+                + channelId + "_"
+                + streamId + "_"
+                + "*";
+        List<SendRtpItem> result = new ArrayList<>();
+        List<Object> scan = RedisUtil.scan(redisTemplate, scanKey);
+        if (!scan.isEmpty()) {
+            for (Object o : scan) {
+                String key = (String) o;
+                result.add(JsonUtil.redisJsonToObject(redisTemplate, key, SendRtpItem.class));
+            }
+        }
+        return result;
+    }
+
     @Override
     public SendRtpItem querySendRTPServer(String platformGbId, String channelId, String streamId, String callId) {
         if (platformGbId == null) {
@@ -268,6 +287,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
         }
     }
 
+    /**
+     * 删除RTP推送信息缓存
+     */
+    @Override
+    public void deleteSendRTPServer(SendRtpItem sendRtpItem) {
+        deleteSendRTPServer(sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(),sendRtpItem.getCallId(), sendRtpItem.getServerId());
+    }
+
     @Override
     public List<SendRtpItem> queryAllSendRTPServer() {
         String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX