Commit a574ff094428decbdc35332d184cd0d210716a44

Authored by 648540858
1 parent 70c20364

修复使用队列导致的问题

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
... ... @@ -79,7 +79,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
79 79  
80 80 private boolean taskQueueHandlerRun = false;
81 81  
82   - private final ConcurrentLinkedQueue<HandlerCatchData> taskQueue = new ConcurrentLinkedQueue<>();
  82 + private ConcurrentLinkedQueue<HandlerCatchData> taskQueue = new ConcurrentLinkedQueue<>();
83 83  
84 84 @Qualifier("taskExecutor")
85 85 @Autowired
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
... ... @@ -72,7 +72,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
72 72  
73 73 private boolean taskQueueHandlerRun = false;
74 74  
75   - private final ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>();
  75 + private ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>();
76 76  
77 77 @Qualifier("taskExecutor")
78 78 @Autowired
... ... @@ -92,13 +92,14 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
92 92 if (!taskQueueHandlerRun) {
93 93 taskQueueHandlerRun = true;
94 94 taskExecutor.execute(() -> {
  95 + logger.info("[处理报警通知]待处理数量:{}", taskQueue.size() );
95 96 while (!taskQueue.isEmpty()) {
96 97 SipMsgInfo sipMsgInfo = taskQueue.poll();
97 98 // 回复200 OK
98 99 try {
99 100 responseAck(getServerTransaction(sipMsgInfo.getEvt()), Response.OK);
100 101 } catch (SipException | InvalidArgumentException | ParseException e) {
101   - logger.error("[收到报警通知], 回复200OK失败", e);
  102 + logger.error("[处理报警通知], 回复200OK失败", e);
102 103 }
103 104  
104 105 Element deviceIdElement = sipMsgInfo.getRootElement().element("DeviceID");
... ... @@ -112,7 +113,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
112 113 deviceAlarm.setAlarmMethod(getText(sipMsgInfo.getRootElement(), "AlarmMethod"));
113 114 String alarmTime = XmlUtil.getText(sipMsgInfo.getRootElement(), "AlarmTime");
114 115 if (alarmTime == null) {
115   - return;
  116 + continue;
116 117 }
117 118 deviceAlarm.setAlarmTime(DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(alarmTime));
118 119 String alarmDescription = getText(sipMsgInfo.getRootElement(), "AlarmDescription");
... ... @@ -182,7 +183,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
182 183 deviceAlarm.setAlarmType(getText(sipMsgInfo.getRootElement().element("Info"), "AlarmType"));
183 184 }
184 185 }
185   -
  186 + logger.info("[收到报警通知]内容:{}", JSONObject.toJSON(deviceAlarm));
186 187 if ("7".equals(deviceAlarm.getAlarmMethod()) ) {
187 188 // 发送给平台的报警信息。 发送redis通知
188 189 AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage();
... ... @@ -190,7 +191,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
190 191 alarmChannelMessage.setAlarmDescription(deviceAlarm.getAlarmDescription());
191 192 alarmChannelMessage.setGbId(channelId);
192 193 redisCatchStorage.sendAlarmMsg(alarmChannelMessage);
193   - return;
  194 + continue;
194 195 }
195 196  
196 197 logger.debug("存储报警信息、报警分类");
... ... @@ -198,7 +199,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
198 199 if (sipConfig.isAlarm()) {
199 200 deviceAlarmService.add(deviceAlarm);
200 201 }
201   - logger.info("[收到报警通知]内容:{}", JSONObject.toJSON(deviceAlarm));
  202 +
202 203 if (redisCatchStorage.deviceIsOnline(sipMsgInfo.getDevice().getDeviceId())) {
203 204 publisher.deviceAlarmEventPublish(deviceAlarm);
204 205 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java
... ... @@ -58,7 +58,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
58 58  
59 59 private boolean taskQueueHandlerRun = false;
60 60  
61   - private final ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>();
  61 + private ConcurrentLinkedQueue<SipMsgInfo> taskQueue = new ConcurrentLinkedQueue<>();
62 62  
63 63 @Qualifier("taskExecutor")
64 64 @Autowired
... ... @@ -83,7 +83,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
83 83 if (rootElementAfterCharset == null) {
84 84 logger.warn("[ 移动设备位置数据通知 ] content cannot be null, {}", sipMsgInfo.getEvt().getRequest());
85 85 responseAck(getServerTransaction(sipMsgInfo.getEvt()), Response.BAD_REQUEST);
86   - return;
  86 + continue;
87 87 }
88 88 MobilePosition mobilePosition = new MobilePosition();
89 89 mobilePosition.setCreateTime(DateUtil.getNow());
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -131,6 +131,24 @@ public class PlayServiceImpl implements IPlayService {
131 131 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
132 132 playResult.setDevice(device);
133 133  
  134 + result.onCompletion(()->{
  135 + // 点播结束时调用截图接口
  136 + taskExecutor.execute(()->{
  137 + // TODO 应该在上流时调用更好,结束也可能是错误结束
  138 + String path = "snap";
  139 + String fileName = deviceId + "_" + channelId + ".jpg";
  140 + WVPResult wvpResult = (WVPResult)result.getResult();
  141 + if (Objects.requireNonNull(wvpResult).getCode() == 0) {
  142 + StreamInfo streamInfoForSuccess = (StreamInfo)wvpResult.getData();
  143 + MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());
  144 + String streamUrl = streamInfoForSuccess.getFmp4();
  145 + // 请求截图
  146 + logger.info("[请求截图]: " + fileName);
  147 + zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);
  148 + }
  149 + });
  150 + });
  151 +
134 152 if (streamInfo != null) {
135 153 String streamId = streamInfo.getStream();
136 154 if (streamId == null) {
... ... @@ -192,21 +210,6 @@ public class PlayServiceImpl implements IPlayService {
192 210 SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false);
193 211 logger.info(JSONObject.toJSONString(ssrcInfo));
194 212 play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response)->{
195   - // 点播结束时调用截图接口
196   - taskExecutor.execute(()->{
197   - // TODO 应该在上流时调用更好,结束也可能是错误结束
198   - String path = "snap";
199   - String fileName = deviceId + "_" + channelId + ".jpg";
200   - WVPResult wvpResult = (WVPResult)result.getResult();
201   - if (Objects.requireNonNull(wvpResult).getCode() == 0) {
202   - StreamInfo streamInfoForSuccess = (StreamInfo)wvpResult.getData();
203   - MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());
204   - String streamUrl = streamInfoForSuccess.getFmp4();
205   - // 请求截图
206   - logger.info("[请求截图]: " + fileName);
207   - zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);
208   - }
209   - });
210 213 if (hookEvent != null) {
211 214 hookEvent.response(mediaServerItem, response);
212 215 }
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
... ... @@ -16,6 +16,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
16 16 import org.springframework.stereotype.Component;
17 17 import org.springframework.util.ObjectUtils;
18 18  
  19 +import javax.validation.constraints.NotNull;
19 20 import java.util.List;
20 21 import java.util.concurrent.ConcurrentLinkedQueue;
21 22  
... ... @@ -36,19 +37,20 @@ public class RedisAlarmMsgListener implements MessageListener {
36 37  
37 38 private boolean taskQueueHandlerRun = false;
38 39  
39   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  40 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
40 41  
41 42 @Qualifier("taskExecutor")
42 43 @Autowired
43 44 private ThreadPoolTaskExecutor taskExecutor;
44 45  
45 46 @Override
46   - public void onMessage(Message message, byte[] bytes) {
  47 + public void onMessage(@NotNull Message message, byte[] bytes) {
47 48 logger.info("收到来自REDIS的ALARM通知: {}", new String(message.getBody()));
48 49  
49 50 taskQueue.offer(message);
50 51 if (!taskQueueHandlerRun) {
51 52 taskQueueHandlerRun = true;
  53 + logger.info("[线程池信息]活动线程数:{}, 最大线程数: {}", taskExecutor.getActiveCount(), taskExecutor.getMaxPoolSize());
52 54 taskExecutor.execute(() -> {
53 55 while (!taskQueue.isEmpty()) {
54 56 Message msg = taskQueue.poll();
... ... @@ -56,7 +58,7 @@ public class RedisAlarmMsgListener implements MessageListener {
56 58 AlarmChannelMessage alarmChannelMessage = JSON.parseObject(msg.getBody(), AlarmChannelMessage.class);
57 59 if (alarmChannelMessage == null) {
58 60 logger.warn("[REDIS的ALARM通知]消息解析失败");
59   - return;
  61 + continue;
60 62 }
61 63 String gbId = alarmChannelMessage.getGbId();
62 64  
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
... ... @@ -90,7 +90,7 @@ public class RedisGbPlayMsgListener implements MessageListener {
90 90  
91 91 private boolean taskQueueHandlerRun = false;
92 92  
93   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  93 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
94 94  
95 95 @Qualifier("taskExecutor")
96 96 @Autowired
... ... @@ -121,7 +121,7 @@ public class RedisGbPlayMsgListener implements MessageListener {
121 121 JSONObject msgJSON = JSON.parseObject(msg.getBody(), JSONObject.class);
122 122 WvpRedisMsg wvpRedisMsg = JSON.toJavaObject(msgJSON, WvpRedisMsg.class);
123 123 if (!userSetting.getServerId().equals(wvpRedisMsg.getToId())) {
124   - return;
  124 + continue;
125 125 }
126 126 if (WvpRedisMsg.isRequest(wvpRedisMsg)) {
127 127 logger.info("[收到REDIS通知] 请求: {}", new String(msg.getBody()));
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGpsMsgListener.java
... ... @@ -35,7 +35,7 @@ public class RedisGpsMsgListener implements MessageListener {
35 35 @Autowired
36 36 private IVideoManagerStorage storager;
37 37  
38   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  38 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
39 39  
40 40 @Qualifier("taskExecutor")
41 41 @Autowired
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamResponseListener.java
... ... @@ -28,7 +28,7 @@ public class RedisPushStreamResponseListener implements MessageListener {
28 28  
29 29 private boolean taskQueueHandlerRun = false;
30 30  
31   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  31 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
32 32  
33 33 @Qualifier("taskExecutor")
34 34 @Autowired
... ... @@ -53,7 +53,7 @@ public class RedisPushStreamResponseListener implements MessageListener {
53 53 MessageForPushChannelResponse response = JSON.parseObject(new String(msg.getBody()), MessageForPushChannelResponse.class);
54 54 if (response == null || ObjectUtils.isEmpty(response.getApp()) || ObjectUtils.isEmpty(response.getStream())){
55 55 logger.info("[REDIS消息-请求推流结果]:参数不全");
56   - return;
  56 + continue;
57 57 }
58 58 // 查看正在等待的invite消息
59 59 if (responseEvents.get(response.getApp() + response.getStream()) != null) {
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusListMsgListener.java
... ... @@ -40,7 +40,7 @@ public class RedisPushStreamStatusListMsgListener implements MessageListener {
40 40  
41 41 private boolean taskQueueHandlerRun = false;
42 42  
43   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  43 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
44 44  
45 45 @Qualifier("taskExecutor")
46 46 @Autowired
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusMsgListener.java
... ... @@ -42,7 +42,7 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
42 42  
43 43  
44 44  
45   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  45 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
46 46  
47 47 @Qualifier("taskExecutor")
48 48 @Autowired
... ... @@ -61,7 +61,7 @@ public class RedisPushStreamStatusMsgListener implements MessageListener, Applic
61 61 PushStreamStatusChangeFromRedisDto statusChangeFromPushStream = JSON.parseObject(msg.getBody(), PushStreamStatusChangeFromRedisDto.class);
62 62 if (statusChangeFromPushStream == null) {
63 63 logger.warn("[REDIS消息]推流设备状态变化消息解析失败");
64   - return;
  64 + continue;
65 65 }
66 66 // 取消定时任务
67 67 dynamicTask.stop(VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED);
... ...
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisStreamMsgListener.java
... ... @@ -35,7 +35,7 @@ public class RedisStreamMsgListener implements MessageListener {
35 35  
36 36 private boolean taskQueueHandlerRun = false;
37 37  
38   - private final ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
  38 + private ConcurrentLinkedQueue<Message> taskQueue = new ConcurrentLinkedQueue<>();
39 39  
40 40 @Qualifier("taskExecutor")
41 41 @Autowired
... ... @@ -53,13 +53,13 @@ public class RedisStreamMsgListener implements MessageListener {
53 53 JSONObject steamMsgJson = JSON.parseObject(msg.getBody(), JSONObject.class);
54 54 if (steamMsgJson == null) {
55 55 logger.warn("[收到redis 流变化]消息解析失败");
56   - return;
  56 + continue;
57 57 }
58 58 String serverId = steamMsgJson.getString("serverId");
59 59  
60 60 if (userSetting.getServerId().equals(serverId)) {
61 61 // 自己发送的消息忽略即可
62   - return;
  62 + continue;
63 63 }
64 64 logger.info("[收到redis 流变化]: {}", new String(message.getBody()));
65 65 String app = steamMsgJson.getString("app");
... ...