Commit c2e26291ceb940892b266852a671deda8f2cd952

Authored by gaofw189
1 parent 55ee6f5f

修复WVP作为下级平台接受recordinfo指令上报上级平台的问题

src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
1 package com.genersoft.iot.vmp.gb28181.bean; 1 package com.genersoft.iot.vmp.gb28181.bean;
2 2
  3 +import lombok.Data;
  4 +
3 import java.time.Instant; 5 import java.time.Instant;
4 import java.util.List; 6 import java.util.List;
5 7
@@ -8,6 +10,7 @@ import java.util.List; @@ -8,6 +10,7 @@ import java.util.List;
8 * @author: swwheihei 10 * @author: swwheihei
9 * @date: 2020年5月8日 下午2:05:56 11 * @date: 2020年5月8日 下午2:05:56
10 */ 12 */
  13 +@Data
11 public class RecordInfo { 14 public class RecordInfo {
12 15
13 private String deviceId; 16 private String deviceId;
@@ -20,6 +23,8 @@ public class RecordInfo { @@ -20,6 +23,8 @@ public class RecordInfo {
20 23
21 private int sumNum; 24 private int sumNum;
22 25
  26 + private int count;
  27 +
23 private Instant lastTime; 28 private Instant lastTime;
24 29
25 private List<RecordItem> recordList; 30 private List<RecordItem> recordList;
src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java
1 package com.genersoft.iot.vmp.gb28181.event.record; 1 package com.genersoft.iot.vmp.gb28181.event.record;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; 3 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
  4 +import com.genersoft.iot.vmp.utils.redis.RedisUtil;
4 import org.slf4j.Logger; 5 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
  7 +import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.context.ApplicationListener; 8 import org.springframework.context.ApplicationListener;
7 import org.springframework.stereotype.Component; 9 import org.springframework.stereotype.Component;
8 10
@@ -20,25 +22,46 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven @@ -20,25 +22,46 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven
20 22
21 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class); 23 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class);
22 24
  25 + private Map<String, RecordEndEventHandler> handlerMap = new ConcurrentHashMap<>();
23 public interface RecordEndEventHandler{ 26 public interface RecordEndEventHandler{
24 void handler(RecordInfo recordInfo); 27 void handler(RecordInfo recordInfo);
25 } 28 }
26 29
27 - private Map<String, RecordEndEventHandler> handlerMap = new ConcurrentHashMap<>();  
28 -  
29 @Override 30 @Override
30 public void onApplicationEvent(RecordEndEvent event) { 31 public void onApplicationEvent(RecordEndEvent event) {
31 - logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(),  
32 - event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); 32 + String deviceId = event.getRecordInfo().getDeviceId();
  33 + String channelId = event.getRecordInfo().getChannelId();
  34 + int count = event.getRecordInfo().getCount();
  35 + int sumNum = event.getRecordInfo().getSumNum();
  36 + logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}/{}条", event.getRecordInfo().getDeviceId(),
  37 + event.getRecordInfo().getChannelId(), count,sumNum);
33 if (handlerMap.size() > 0) { 38 if (handlerMap.size() > 0) {
34 - for (RecordEndEventHandler recordEndEventHandler : handlerMap.values()) {  
35 - recordEndEventHandler.handler(event.getRecordInfo()); 39 + RecordEndEventHandler handler = handlerMap.get(deviceId + channelId);
  40 + if (handler !=null){
  41 + handler.handler(event.getRecordInfo());
  42 + if (count ==sumNum){
  43 + handlerMap.remove(deviceId + channelId);
  44 + }
36 } 45 }
37 } 46 }
38 - handlerMap.clear();  
39 } 47 }
40 48
  49 + /**
  50 + * 添加
  51 + * @param device
  52 + * @param channelId
  53 + * @param recordEndEventHandler
  54 + */
41 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) { 55 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) {
42 handlerMap.put(device + channelId, recordEndEventHandler); 56 handlerMap.put(device + channelId, recordEndEventHandler);
43 } 57 }
  58 + /**
  59 + * 添加
  60 + * @param device
  61 + * @param channelId
  62 + */
  63 + public void delEndEventHandler(String device, String channelId) {
  64 + handlerMap.remove(device + channelId);
  65 + }
  66 +
44 } 67 }
src/main/java/com/genersoft/iot/vmp/gb28181/session/RecordDataCatch.java
1 package com.genersoft.iot.vmp.gb28181.session; 1 package com.genersoft.iot.vmp.gb28181.session;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.*; 3 import com.genersoft.iot.vmp.gb28181.bean.*;
  4 +import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEventListener;
4 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 5 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
5 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 6 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
6 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 7 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
@@ -23,14 +24,17 @@ public class RecordDataCatch { @@ -23,14 +24,17 @@ public class RecordDataCatch {
23 24
24 @Autowired 25 @Autowired
25 private DeferredResultHolder deferredResultHolder; 26 private DeferredResultHolder deferredResultHolder;
  27 + @Autowired
  28 + private RecordEndEventListener recordEndEventListener;
26 29
27 30
28 - public int put(String deviceId, String sn, int sumNum, List<RecordItem> recordItems) { 31 + public int put(String deviceId,String channelId, String sn, int sumNum, List<RecordItem> recordItems) {
29 String key = deviceId + sn; 32 String key = deviceId + sn;
30 RecordInfo recordInfo = data.get(key); 33 RecordInfo recordInfo = data.get(key);
31 if (recordInfo == null) { 34 if (recordInfo == null) {
32 recordInfo = new RecordInfo(); 35 recordInfo = new RecordInfo();
33 recordInfo.setDeviceId(deviceId); 36 recordInfo.setDeviceId(deviceId);
  37 + recordInfo.setChannelId(channelId);
34 recordInfo.setSn(sn.trim()); 38 recordInfo.setSn(sn.trim());
35 recordInfo.setSumNum(sumNum); 39 recordInfo.setSumNum(sumNum);
36 recordInfo.setRecordList(Collections.synchronizedList(new ArrayList<>())); 40 recordInfo.setRecordList(Collections.synchronizedList(new ArrayList<>()));
@@ -67,6 +71,7 @@ public class RecordDataCatch { @@ -67,6 +71,7 @@ public class RecordDataCatch {
67 msg.setKey(msgKey); 71 msg.setKey(msgKey);
68 msg.setData(recordInfo); 72 msg.setData(recordInfo);
69 deferredResultHolder.invokeAllResult(msg); 73 deferredResultHolder.invokeAllResult(msg);
  74 + recordEndEventListener.delEndEventHandler(recordInfo.getDeviceId(),recordInfo.getChannelId());
70 data.remove(key); 75 data.remove(key);
71 } 76 }
72 } 77 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
@@ -102,8 +102,9 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent @@ -102,8 +102,9 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent
102 Element recordListElement = rootElementForCharset.element("RecordList"); 102 Element recordListElement = rootElementForCharset.element("RecordList");
103 if (recordListElement == null || sumNum == 0) { 103 if (recordListElement == null || sumNum == 0) {
104 logger.info("无录像数据"); 104 logger.info("无录像数据");
  105 + int count = recordDataCatch.put(take.getDevice().getDeviceId(),channelId, sn, sumNum, new ArrayList<>());
  106 + recordInfo.setCount(count);
105 eventPublisher.recordEndEventPush(recordInfo); 107 eventPublisher.recordEndEventPush(recordInfo);
106 - recordDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, new ArrayList<>());  
107 releaseRequest(take.getDevice().getDeviceId(), sn); 108 releaseRequest(take.getDevice().getDeviceId(), sn);
108 } else { 109 } else {
109 Iterator<Element> recordListIterator = recordListElement.elementIterator(); 110 Iterator<Element> recordListIterator = recordListElement.elementIterator();
@@ -137,12 +138,11 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent @@ -137,12 +138,11 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent
137 recordList.add(record); 138 recordList.add(record);
138 } 139 }
139 recordInfo.setRecordList(recordList); 140 recordInfo.setRecordList(recordList);
  141 + int count = recordDataCatch.put(take.getDevice().getDeviceId(),channelId, sn, sumNum, recordList);recordInfo.setCount(count);
  142 + logger.info("[国标录像], {}->{}: {}/{}", take.getDevice().getDeviceId(), sn, count, sumNum);
140 // 发送消息,如果是上级查询此录像,则会通过这里通知给上级 143 // 发送消息,如果是上级查询此录像,则会通过这里通知给上级
141 eventPublisher.recordEndEventPush(recordInfo); 144 eventPublisher.recordEndEventPush(recordInfo);
142 - int count = recordDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, recordList);  
143 - logger.info("[国标录像], {}->{}: {}/{}", take.getDevice().getDeviceId(), sn, count, sumNum);  
144 } 145 }
145 -  
146 if (recordDataCatch.isComplete(take.getDevice().getDeviceId(), sn)){ 146 if (recordDataCatch.isComplete(take.getDevice().getDeviceId(), sn)){
147 releaseRequest(take.getDevice().getDeviceId(), sn); 147 releaseRequest(take.getDevice().getDeviceId(), sn);
148 } 148 }