Commit bc38f5ef299f44f65fd34258b84272a027c10cb6

Authored by 648540858
1 parent 76dedb11

修复流地址返回错误

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -92,39 +92,36 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -92,39 +92,36 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
92 @Override 92 @Override
93 public void process(RequestEvent evt) { 93 public void process(RequestEvent evt) {
94 try { 94 try {
95 -  
96 taskQueue.offer(new HandlerCatchData(evt, null, null)); 95 taskQueue.offer(new HandlerCatchData(evt, null, null));
97 responseAck(evt, Response.OK); 96 responseAck(evt, Response.OK);
98 if (!taskQueueHandlerRun) { 97 if (!taskQueueHandlerRun) {
99 taskQueueHandlerRun = true; 98 taskQueueHandlerRun = true;
100 taskExecutor.execute(()-> { 99 taskExecutor.execute(()-> {
101 - while (!taskQueue.isEmpty()) {  
102 - try {  
103 - HandlerCatchData take = taskQueue.poll();  
104 - Element rootElement = getRootElement(take.getEvt());  
105 - String cmd = XmlUtil.getText(rootElement, "CmdType");  
106 -  
107 - if (CmdType.CATALOG.equals(cmd)) {  
108 - logger.info("接收到Catalog通知");  
109 - processNotifyCatalogList(take.getEvt());  
110 - } else if (CmdType.ALARM.equals(cmd)) {  
111 - logger.info("接收到Alarm通知");  
112 - processNotifyAlarm(take.getEvt());  
113 - } else if (CmdType.MOBILE_POSITION.equals(cmd)) {  
114 - logger.info("接收到MobilePosition通知");  
115 - processNotifyMobilePosition(take.getEvt());  
116 - } else {  
117 - logger.info("接收到消息:" + cmd);  
118 - }  
119 - } catch (DocumentException e) {  
120 - throw new RuntimeException(e);  
121 - } 100 + while (!taskQueue.isEmpty()) {
  101 + try {
  102 + HandlerCatchData take = taskQueue.poll();
  103 + Element rootElement = getRootElement(take.getEvt());
  104 + String cmd = XmlUtil.getText(rootElement, "CmdType");
  105 +
  106 + if (CmdType.CATALOG.equals(cmd)) {
  107 + logger.info("接收到Catalog通知");
  108 + processNotifyCatalogList(take.getEvt());
  109 + } else if (CmdType.ALARM.equals(cmd)) {
  110 + logger.info("接收到Alarm通知");
  111 + processNotifyAlarm(take.getEvt());
  112 + } else if (CmdType.MOBILE_POSITION.equals(cmd)) {
  113 + logger.info("接收到MobilePosition通知");
  114 + processNotifyMobilePosition(take.getEvt());
  115 + } else {
  116 + logger.info("接收到消息:" + cmd);
122 } 117 }
123 - taskQueueHandlerRun = false;  
124 - }); 118 + } catch (DocumentException e) {
  119 + throw new RuntimeException(e);
  120 + }
  121 + }
  122 + taskQueueHandlerRun = false;
  123 + });
125 } 124 }
126 -  
127 -  
128 } catch (SipException | InvalidArgumentException | ParseException e) { 125 } catch (SipException | InvalidArgumentException | ParseException e) {
129 e.printStackTrace(); 126 e.printStackTrace();
130 } 127 }
@@ -174,7 +171,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -174,7 +171,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
174 } else { 171 } else {
175 mobilePosition.setAltitude(0.0); 172 mobilePosition.setAltitude(0.0);
176 } 173 }
177 - logger.info("[收到 移动位置订阅]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), 174 + logger.info("[收到移动位置订阅通知]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(),
178 mobilePosition.getLongitude(), mobilePosition.getLatitude()); 175 mobilePosition.getLongitude(), mobilePosition.getLatitude());
179 mobilePosition.setReportSource("Mobile Position"); 176 mobilePosition.setReportSource("Mobile Position");
180 177
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -67,9 +67,9 @@ public class MediaServiceImpl implements IMediaService { @@ -67,9 +67,9 @@ public class MediaServiceImpl implements IMediaService {
67 JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class); 67 JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class);
68 JSONArray tracks = mediaJSON.getJSONArray("tracks"); 68 JSONArray tracks = mediaJSON.getJSONArray("tracks");
69 if (authority) { 69 if (authority) {
70 - streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, streamAuthorityInfo.getCallId()); 70 + streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,streamAuthorityInfo.getCallId());
71 }else { 71 }else {
72 - streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, null); 72 + streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,null);
73 } 73 }
74 74
75 } 75 }
src/main/java/com/genersoft/iot/vmp/service/impl/RedisGpsMsgListener.java
1 package com.genersoft.iot.vmp.service.impl; 1 package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
  4 +import com.genersoft.iot.vmp.gb28181.bean.HandlerCatchData;
4 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 5 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 6 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 import org.jetbrains.annotations.NotNull; 7 import org.jetbrains.annotations.NotNull;
7 import org.slf4j.Logger; 8 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Qualifier;
10 import org.springframework.data.redis.connection.Message; 12 import org.springframework.data.redis.connection.Message;
11 import org.springframework.data.redis.connection.MessageListener; 13 import org.springframework.data.redis.connection.MessageListener;
  14 +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
12 import org.springframework.stereotype.Component; 15 import org.springframework.stereotype.Component;
13 16
  17 +import java.util.concurrent.ConcurrentLinkedQueue;
  18 +
14 /** 19 /**
15 * 接收来自redis的GPS更新通知 20 * 接收来自redis的GPS更新通知
16 * @author lin 21 * @author lin
@@ -20,13 +25,31 @@ public class RedisGpsMsgListener implements MessageListener { @@ -20,13 +25,31 @@ public class RedisGpsMsgListener implements MessageListener {
20 25
21 private final static Logger logger = LoggerFactory.getLogger(RedisGpsMsgListener.class); 26 private final static Logger logger = LoggerFactory.getLogger(RedisGpsMsgListener.class);
22 27
  28 + private boolean taskQueueHandlerRun = false;
  29 +
23 @Autowired 30 @Autowired
24 private IRedisCatchStorage redisCatchStorage; 31 private IRedisCatchStorage redisCatchStorage;
25 32
  33 + private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  34 +
  35 + @Qualifier("taskExecutor")
  36 + @Autowired
  37 + private ThreadPoolTaskExecutor taskExecutor;
  38 +
  39 +
26 @Override 40 @Override
27 public void onMessage(@NotNull Message message, byte[] bytes) { 41 public void onMessage(@NotNull Message message, byte[] bytes) {
28 - // TODO 加消息队列  
29 - GPSMsgInfo gpsMsgInfo = JSON.parseObject(message.getBody(), GPSMsgInfo.class);  
30 - redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo); 42 + taskQueue.offer(message);
  43 + if (!taskQueueHandlerRun) {
  44 + taskQueueHandlerRun = true;
  45 + taskExecutor.execute(() -> {
  46 + while (!taskQueue.isEmpty()) {
  47 + Message msg = taskQueue.poll();
  48 + GPSMsgInfo gpsMsgInfo = JSON.parseObject(msg.getBody(), GPSMsgInfo.class);
  49 + redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo);
  50 + }
  51 + taskQueueHandlerRun = false;
  52 + });
  53 + }
31 } 54 }
32 } 55 }
src/main/java/com/genersoft/iot/vmp/service/impl/RedisPushStreamStatusMsgListener.java
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
14 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 14 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
15 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; 15 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
16 import com.genersoft.iot.vmp.service.IStreamPushService; 16 import com.genersoft.iot.vmp.service.IStreamPushService;
  17 +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
17 import com.genersoft.iot.vmp.service.bean.PushStreamStatusChangeFromRedisDto; 18 import com.genersoft.iot.vmp.service.bean.PushStreamStatusChangeFromRedisDto;
18 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis; 19 import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis;
19 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 20 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -21,14 +22,17 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; @@ -21,14 +22,17 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
21 import org.slf4j.Logger; 22 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory; 23 import org.slf4j.LoggerFactory;
23 import org.springframework.beans.factory.annotation.Autowired; 24 import org.springframework.beans.factory.annotation.Autowired;
  25 +import org.springframework.beans.factory.annotation.Qualifier;
24 import org.springframework.boot.ApplicationArguments; 26 import org.springframework.boot.ApplicationArguments;
25 import org.springframework.boot.ApplicationRunner; 27 import org.springframework.boot.ApplicationRunner;
26 import org.springframework.data.redis.connection.Message; 28 import org.springframework.data.redis.connection.Message;
27 import org.springframework.data.redis.connection.MessageListener; 29 import org.springframework.data.redis.connection.MessageListener;
  30 +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
28 import org.springframework.stereotype.Component; 31 import org.springframework.stereotype.Component;
29 32
30 import java.util.ArrayList; 33 import java.util.ArrayList;
31 import java.util.List; 34 import java.util.List;
  35 +import java.util.concurrent.ConcurrentLinkedQueue;
32 36
33 37
34 /** 38 /**
@@ -40,6 +44,8 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic @@ -40,6 +44,8 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
40 44
41 private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamStatusMsgListener.class); 45 private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamStatusMsgListener.class);
42 46
  47 + private boolean taskQueueHandlerRun = false;
  48 +
43 @Autowired 49 @Autowired
44 private IRedisCatchStorage redisCatchStorage; 50 private IRedisCatchStorage redisCatchStorage;
45 51
@@ -47,39 +53,51 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic @@ -47,39 +53,51 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
47 private IStreamPushService streamPushService; 53 private IStreamPushService streamPushService;
48 54
49 @Autowired 55 @Autowired
50 - private EventPublisher eventPublisher; 56 + private DynamicTask dynamicTask;
51 57
52 - @Autowired  
53 - private UserSetting userSetting;  
54 58
  59 +
  60 + private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  61 +
  62 + @Qualifier("taskExecutor")
55 @Autowired 63 @Autowired
56 - private DynamicTask dynamicTask; 64 + private ThreadPoolTaskExecutor taskExecutor;
57 65
58 @Override 66 @Override
59 public void onMessage(Message message, byte[] bytes) { 67 public void onMessage(Message message, byte[] bytes) {
60 // TODO 增加队列 68 // TODO 增加队列
61 logger.warn("[REDIS 消息-推流设备状态变化]: {}", new String(message.getBody())); 69 logger.warn("[REDIS 消息-推流设备状态变化]: {}", new String(message.getBody()));
62 - //  
63 - PushStreamStatusChangeFromRedisDto statusChangeFromPushStream = JSON.parseObject(message.getBody(), PushStreamStatusChangeFromRedisDto.class);  
64 - if (statusChangeFromPushStream == null) {  
65 - logger.warn("[REDIS 消息]推流设备状态变化消息解析失败");  
66 - return;  
67 - }  
68 - // 取消定时任务  
69 - dynamicTask.stop(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED);  
70 - if (statusChangeFromPushStream.isSetAllOffline()) {  
71 - // 所有设备离线  
72 - streamPushService.allStreamOffline();  
73 - }  
74 - if (statusChangeFromPushStream.getOfflineStreams() != null  
75 - && statusChangeFromPushStream.getOfflineStreams().size() > 0) {  
76 - // 更新部分设备离线  
77 - streamPushService.offline(statusChangeFromPushStream.getOfflineStreams());  
78 - }  
79 - if (statusChangeFromPushStream.getOnlineStreams() != null &&  
80 - statusChangeFromPushStream.getOnlineStreams().size() > 0) {  
81 - // 更新部分设备上线  
82 - streamPushService.online(statusChangeFromPushStream.getOnlineStreams()); 70 + taskQueue.offer(message);
  71 +
  72 + if (!taskQueueHandlerRun) {
  73 + taskQueueHandlerRun = true;
  74 + taskExecutor.execute(() -> {
  75 + while (!taskQueue.isEmpty()) {
  76 + Message msg = taskQueue.poll();
  77 + PushStreamStatusChangeFromRedisDto statusChangeFromPushStream = JSON.parseObject(msg.getBody(), PushStreamStatusChangeFromRedisDto.class);
  78 + if (statusChangeFromPushStream == null) {
  79 + logger.warn("[REDIS 消息]推流设备状态变化消息解析失败");
  80 + return;
  81 + }
  82 + // 取消定时任务
  83 + dynamicTask.stop(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED);
  84 + if (statusChangeFromPushStream.isSetAllOffline()) {
  85 + // 所有设备离线
  86 + streamPushService.allStreamOffline();
  87 + }
  88 + if (statusChangeFromPushStream.getOfflineStreams() != null
  89 + && statusChangeFromPushStream.getOfflineStreams().size() > 0) {
  90 + // 更新部分设备离线
  91 + streamPushService.offline(statusChangeFromPushStream.getOfflineStreams());
  92 + }
  93 + if (statusChangeFromPushStream.getOnlineStreams() != null &&
  94 + statusChangeFromPushStream.getOnlineStreams().size() > 0) {
  95 + // 更新部分设备上线
  96 + streamPushService.online(statusChangeFromPushStream.getOnlineStreams());
  97 + }
  98 + }
  99 + taskQueueHandlerRun = false;
  100 + });
83 } 101 }
84 } 102 }
85 103
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -688,21 +688,21 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -688,21 +688,21 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
688 @Override 688 @Override
689 public void sendMobilePositionMsg(JSONObject jsonObject) { 689 public void sendMobilePositionMsg(JSONObject jsonObject) {
690 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION; 690 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION;
691 - logger.info("[redis 移动位置订阅通知] {}: {}", key, jsonObject.toString()); 691 + logger.info("[redis发送通知]移动位置 {}: {}", key, jsonObject.toString());
692 redis.convertAndSend(key, jsonObject); 692 redis.convertAndSend(key, jsonObject);
693 } 693 }
694 694
695 @Override 695 @Override
696 public void sendStreamPushRequestedMsg(MessageForPushChannel msg) { 696 public void sendStreamPushRequestedMsg(MessageForPushChannel msg) {
697 String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED; 697 String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED;
698 - logger.info("[redis 推流被请求通知] {}: {}/{}", key, msg.getApp(), msg.getStream()); 698 + logger.info("[redis发送通知]推流被请求 {}: {}/{}", key, msg.getApp(), msg.getStream());
699 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); 699 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
700 } 700 }
701 701
702 @Override 702 @Override
703 public void sendAlarmMsg(AlarmChannelMessage msg) { 703 public void sendAlarmMsg(AlarmChannelMessage msg) {
704 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM; 704 String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM;
705 - logger.info("[redis 报警通知] {}: {}", key, JSON.toJSON(msg)); 705 + logger.info("[redis发送通知] 报警{}: {}", key, JSON.toJSON(msg));
706 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); 706 redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg));
707 } 707 }
708 708
@@ -715,7 +715,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -715,7 +715,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
715 @Override 715 @Override
716 public void sendStreamPushRequestedMsgForStatus() { 716 public void sendStreamPushRequestedMsgForStatus() {
717 String key = VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED; 717 String key = VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED;
718 - logger.info("[redis 通知]获取所有推流设备的状态"); 718 + logger.info("[redis通知]获取所有推流设备的状态");
719 JSONObject jsonObject = new JSONObject(); 719 JSONObject jsonObject = new JSONObject();
720 jsonObject.put(key, key); 720 jsonObject.put(key, key);
721 redis.convertAndSend(key, jsonObject); 721 redis.convertAndSend(key, jsonObject);