Commit 3b21f385cdae7d94fce1ebba6abb06a893f57114

Authored by 648540858
1 parent ce931ab8

对需要向设备发起请求的http请求,使用缓存,等待设备请求返回的时候一次性释放所有请求

src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
... ... @@ -13,7 +13,9 @@ import java.util.List;
13 13 public class RecordInfo {
14 14  
15 15 private String deviceId;
16   -
  16 +
  17 + private String channelId;
  18 +
17 19 private String name;
18 20  
19 21 private int sumNum;
... ... @@ -52,4 +54,11 @@ public class RecordInfo {
52 54 this.recordList = recordList;
53 55 }
54 56  
  57 + public String getChannelId() {
  58 + return channelId;
  59 + }
  60 +
  61 + public void setChannelId(String channelId) {
  62 + this.channelId = channelId;
  63 + }
55 64 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
... ... @@ -54,11 +54,9 @@ public class CheckForAllRecordsThread extends Thread {
54 54 // 自然顺序排序, 元素进行升序排列
55 55 this.recordInfo.getRecordList().sort(Comparator.naturalOrder());
56 56 RequestMessage msg = new RequestMessage();
57   - String deviceId = recordInfo.getDeviceId();
58   - msg.setDeviceId(deviceId);
59   - msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO);
  57 + msg.setKey(DeferredResultHolder.CALLBACK_CMD_RECORDINFO + recordInfo.getDeviceId() + recordInfo.getChannelId());
60 58 msg.setData(recordInfo);
61   - deferredResultHolder.invokeResult(msg);
  59 + deferredResultHolder.invokeAllResult(msg);
62 60 logger.info("处理完成,返回结果");
63 61 MessageRequestProcessor.threadNameList.remove(cacheKey);
64 62 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
1 1 package com.genersoft.iot.vmp.gb28181.transmit.callback;
2 2  
  3 +import java.util.HashMap;
3 4 import java.util.Map;
  5 +import java.util.Set;
4 6 import java.util.concurrent.ConcurrentHashMap;
5 7  
6 8 import org.springframework.http.HttpStatus;
... ... @@ -45,22 +47,72 @@ public class DeferredResultHolder {
45 47  
46 48 public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
47 49  
48   - private Map<String, DeferredResult> map = new ConcurrentHashMap<String, DeferredResult>();
  50 + private Map<String, Map<String, DeferredResult>> map = new ConcurrentHashMap<>();
49 51  
50 52  
51   - public void put(String key, DeferredResult result) {
52   - map.put(key, result);
  53 + public void put(String key, String id, DeferredResult result) {
  54 + Map<String, DeferredResult> deferredResultMap = map.get(key);
  55 + if (deferredResultMap == null) {
  56 + deferredResultMap = new ConcurrentHashMap<>();
  57 + map.put(key, deferredResultMap);
  58 + }
  59 + deferredResultMap.put(id, result);
53 60 }
54 61  
55   - public DeferredResult get(String key) {
56   - return map.get(key);
  62 + public DeferredResult get(String key, String id) {
  63 + Map<String, DeferredResult> deferredResultMap = map.get(key);
  64 + if (deferredResultMap == null) return null;
  65 + return deferredResultMap.get(id);
57 66 }
58   -
  67 +
  68 + public boolean exist(String key, String id){
  69 + if (key == null) return false;
  70 + Map<String, DeferredResult> deferredResultMap = map.get(key);
  71 + if (id == null) {
  72 + return deferredResultMap != null;
  73 + }else {
  74 + return deferredResultMap != null && deferredResultMap.get(id) != null;
  75 + }
  76 + }
  77 +
  78 + /**
  79 + * 释放单个请求
  80 + * @param msg
  81 + */
59 82 public void invokeResult(RequestMessage msg) {
60   - DeferredResult result = map.get(msg.getId());
  83 + Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
  84 + if (deferredResultMap == null) {
  85 + return;
  86 + }
  87 + DeferredResult result = deferredResultMap.get(msg.getId());
61 88 if (result == null) {
62 89 return;
63 90 }
64 91 result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
  92 + deferredResultMap.remove(msg.getId());
  93 + if (deferredResultMap.size() == 0) {
  94 + map.remove(msg.getKey());
  95 + }
  96 + }
  97 +
  98 + /**
  99 + * 释放所有的请求
  100 + * @param msg
  101 + */
  102 + public void invokeAllResult(RequestMessage msg) {
  103 + Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
  104 + if (deferredResultMap == null) {
  105 + return;
  106 + }
  107 + Set<String> ids = deferredResultMap.keySet();
  108 + for (String id : ids) {
  109 + DeferredResult result = deferredResultMap.get(id);
  110 + if (result == null) {
  111 + return;
  112 + }
  113 + result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
  114 + }
  115 + map.remove(msg.getKey());
  116 +
65 117 }
66 118 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java
... ... @@ -9,12 +9,10 @@ public class RequestMessage {
9 9  
10 10 private String id;
11 11  
12   - private String deviceId;
13   -
14   - private String type;
15   -
  12 + private String key;
  13 +
16 14 private Object data;
17   -
  15 +
18 16 public String getId() {
19 17 return id;
20 18 }
... ... @@ -23,22 +21,12 @@ public class RequestMessage {
23 21 this.id = id;
24 22 }
25 23  
26   - public String getDeviceId() {
27   - return deviceId;
28   - }
29   -
30   - public void setDeviceId(String deviceId) {
31   - this.deviceId = deviceId;
32   - this.id = type + deviceId;
33   - }
34   -
35   - public String getType() {
36   - return type;
  24 + public void setKey(String key) {
  25 + this.key = key;
37 26 }
38 27  
39   - public void setType(String type) {
40   - this.type = type;
41   - this.id = type + deviceId;
  28 + public String getKey() {
  29 + return key;
42 30 }
43 31  
44 32 public Object getData() {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
... ... @@ -173,12 +173,12 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
173 173 Device device = storager.queryVideoDevice(deviceId);
174 174 if (device == null) {
175 175 logger.warn("处理MobilePosition移动位置消息时未找到设备信息");
  176 + response404Ack(evt);
176 177 return;
177 178 }
178 179 Element rootElement = getRootElement(evt, device.getCharset());
179 180  
180 181 MobilePosition mobilePosition = new MobilePosition();
181   - Element deviceIdElement = rootElement.element("DeviceID");
182 182 if (!StringUtils.isEmpty(device.getName())) {
183 183 mobilePosition.setDeviceName(device.getName());
184 184 }
... ... @@ -227,11 +227,17 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
227 227 */
228 228 private void processMessageDeviceStatus(RequestEvent evt) {
229 229 try {
  230 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  231 + Device device = storager.queryVideoDevice(deviceId);
  232 + if (device == null) {
  233 + logger.warn("处理DeviceStatus设备状态Message时未找到设备信息");
  234 + response404Ack(evt);
  235 + return;
  236 + }
230 237 Element rootElement = getRootElement(evt);
231 238 String name = rootElement.getName();
232 239 Element deviceIdElement = rootElement.element("DeviceID");
233   - String deviceId = deviceIdElement.getText();
234   - Device device = storager.queryVideoDevice(deviceId);
  240 + String channelId = deviceIdElement.getText();
235 241 if (name.equalsIgnoreCase("Query")) { // 区分是Response——查询响应,还是Query——查询请求
236 242 logger.info("接收到DeviceStatus查询消息");
237 243 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
... ... @@ -258,10 +264,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
258 264 logger.debug(json.toJSONString());
259 265 }
260 266 RequestMessage msg = new RequestMessage();
261   - msg.setDeviceId(deviceId);
262   - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS);
  267 + msg.setKey(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId + channelId);
263 268 msg.setData(json);
264   - deferredResultHolder.invokeResult(msg);
  269 + deferredResultHolder.invokeAllResult(msg);
265 270  
266 271 if (offLineDetector.isOnline(deviceId)) {
267 272 publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
... ... @@ -282,8 +287,15 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
282 287 */
283 288 private void processMessageDeviceControl(RequestEvent evt) {
284 289 try {
  290 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  291 + Device device = storager.queryVideoDevice(deviceId);
  292 + if (device == null) {
  293 + logger.warn("处理DeviceControl设备状态Message未找到设备信息");
  294 + response404Ack(evt);
  295 + return;
  296 + }
285 297 Element rootElement = getRootElement(evt);
286   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  298 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
287 299 //String result = XmlUtil.getText(rootElement, "Result");
288 300 // 回复200 OK
289 301 responseAck(evt);
... ... @@ -295,10 +307,10 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
295 307 logger.debug(json.toJSONString());
296 308 }
297 309 RequestMessage msg = new RequestMessage();
298   - msg.setDeviceId(deviceId);
299   - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL);
  310 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId;
  311 + msg.setKey(key);
300 312 msg.setData(json);
301   - deferredResultHolder.invokeResult(msg);
  313 + deferredResultHolder.invokeAllResult(msg);
302 314 } else {
303 315 // 此处是上级发出的DeviceControl指令
304 316 String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
... ... @@ -344,8 +356,8 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
344 356 // 云台/前端控制命令
345 357 if (!StringUtils.isEmpty(XmlUtil.getText(rootElement,"PTZCmd")) && !deviceId.equals(targetGBId)) {
346 358 String cmdString = XmlUtil.getText(rootElement,"PTZCmd");
347   - Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId);
348   - cmder.fronEndCmd(device, deviceId, cmdString);
  359 + Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId);
  360 + cmder.fronEndCmd(deviceForPlatform, deviceId, cmdString);
349 361 }
350 362 }
351 363 } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
... ... @@ -360,8 +372,16 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
360 372 */
361 373 private void processMessageDeviceConfig(RequestEvent evt) {
362 374 try {
  375 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  376 + // 查询设备是否存在
  377 + Device device = storager.queryVideoDevice(deviceId);
  378 + if (device == null) {
  379 + logger.warn("处理DeviceConfig设备状态Message消息时未找到设备信息");
  380 + response404Ack(evt);
  381 + return;
  382 + }
363 383 Element rootElement = getRootElement(evt);
364   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  384 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
365 385 // 回复200 OK
366 386 responseAck(evt);
367 387 if (rootElement.getName().equals("Response")) {
... ... @@ -371,11 +391,11 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
371 391 if (logger.isDebugEnabled()) {
372 392 logger.debug(json.toJSONString());
373 393 }
  394 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId;
374 395 RequestMessage msg = new RequestMessage();
375   - msg.setDeviceId(deviceId);
376   - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG);
  396 + msg.setKey(key);
377 397 msg.setData(json);
378   - deferredResultHolder.invokeResult(msg);
  398 + deferredResultHolder.invokeAllResult(msg);
379 399 } else {
380 400 // 此处是上级发出的DeviceConfig指令
381 401 }
... ... @@ -391,8 +411,17 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
391 411 */
392 412 private void processMessageConfigDownload(RequestEvent evt) {
393 413 try {
  414 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  415 + // 查询设备是否存在
  416 + Device device = storager.queryVideoDevice(deviceId);
  417 + if (device == null) {
  418 + logger.warn("处理ConfigDownload设备状态Message时未找到设备信息");
  419 + response404Ack(evt);
  420 + return;
  421 + }
394 422 Element rootElement = getRootElement(evt);
395   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  423 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
  424 + String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + deviceId + channelId;
396 425 // 回复200 OK
397 426 responseAck(evt);
398 427 if (rootElement.getName().equals("Response")) {
... ... @@ -403,10 +432,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
403 432 logger.debug(json.toJSONString());
404 433 }
405 434 RequestMessage msg = new RequestMessage();
406   - msg.setDeviceId(deviceId);
407   - msg.setType(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD);
  435 + msg.setKey(key);
408 436 msg.setData(json);
409   - deferredResultHolder.invokeResult(msg);
  437 + deferredResultHolder.invokeAllResult(msg);
410 438 } else {
411 439 // 此处是上级发出的DeviceConfig指令
412 440 }
... ... @@ -422,8 +450,17 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
422 450 */
423 451 private void processMessagePresetQuery(RequestEvent evt) {
424 452 try {
  453 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  454 + // 查询设备是否存在
  455 + Device device = storager.queryVideoDevice(deviceId);
  456 + if (device == null) {
  457 + logger.warn("处理PresetQuery预置位列表Message时未找到设备信息");
  458 + response404Ack(evt);
  459 + return;
  460 + }
425 461 Element rootElement = getRootElement(evt);
426   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  462 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
  463 + String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId + channelId;
427 464 // 回复200 OK
428 465 responseAck(evt);
429 466 if (rootElement.getName().equals("Response")) {// !StringUtils.isEmpty(result)) {
... ... @@ -434,10 +471,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
434 471 logger.debug(json.toJSONString());
435 472 }
436 473 RequestMessage msg = new RequestMessage();
437   - msg.setDeviceId(deviceId);
438   - msg.setType(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY);
  474 + msg.setKey(key);
439 475 msg.setData(json);
440   - deferredResultHolder.invokeResult(msg);
  476 + deferredResultHolder.invokeAllResult(msg);
441 477 } else {
442 478 // 此处是上级发出的DeviceControl指令
443 479 }
... ... @@ -453,11 +489,19 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
453 489 */
454 490 private void processMessageDeviceInfo(RequestEvent evt) {
455 491 try {
  492 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  493 + // 查询设备是否存在
  494 + Device device = storager.queryVideoDevice(deviceId);
  495 + if (device == null) {
  496 + logger.warn("处理DeviceInfo设备信息Message时未找到设备信息");
  497 + response404Ack(evt);
  498 + return;
  499 + }
456 500 Element rootElement = getRootElement(evt);
457 501 String requestName = rootElement.getName();
458 502 Element deviceIdElement = rootElement.element("DeviceID");
459   - String deviceId = deviceIdElement.getTextTrim();
460   - Device device = storager.queryVideoDevice(deviceId);
  503 + String channelId = deviceIdElement.getTextTrim();
  504 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICEINFO + deviceId + channelId;
461 505 if (device != null ) {
462 506 rootElement = getRootElement(evt, device.getCharset());
463 507 }
... ... @@ -492,10 +536,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
492 536 storager.updateDevice(device);
493 537  
494 538 RequestMessage msg = new RequestMessage();
495   - msg.setDeviceId(deviceId);
496   - msg.setType(DeferredResultHolder.CALLBACK_CMD_DEVICEINFO);
  539 + msg.setKey(key);
497 540 msg.setData(device);
498   - deferredResultHolder.invokeResult(msg);
  541 + deferredResultHolder.invokeAllResult(msg);
499 542 // 回复200 OK
500 543 responseAck(evt);
501 544 if (offLineDetector.isOnline(deviceId)) {
... ... @@ -514,12 +557,22 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
514 557 */
515 558 private void processMessageCatalogList(RequestEvent evt) {
516 559 try {
  560 +
  561 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  562 + // 查询设备是否存在
  563 + Device device = storager.queryVideoDevice(deviceId);
  564 + if (device == null) {
  565 + logger.warn("处理DeviceInfo设备信息Message时未找到设备信息");
  566 + response404Ack(evt);
  567 + return;
  568 + }
  569 +
517 570 Element rootElement = getRootElement(evt);
518 571 String name = rootElement.getName();
519 572 Element deviceIdElement = rootElement.element("DeviceID");
520   - String deviceId = deviceIdElement.getText();
  573 + String channelId = deviceIdElement.getText();
521 574 Element deviceListElement = rootElement.element("DeviceList");
522   -
  575 + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
523 576 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
524 577 AddressImpl address = (AddressImpl) fromHeader.getAddress();
525 578 SipUri uri = (SipUri) address.getURI();
... ... @@ -581,10 +634,6 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
581 634  
582 635  
583 636 } else {
584   - Device device = storager.queryVideoDevice(deviceId);
585   - if (device == null) {
586   - return;
587   - }
588 637 deviceListElement = getRootElement(evt, device.getCharset()).element("DeviceList");
589 638 Iterator<Element> deviceListIterator = deviceListElement.elementIterator();
590 639 if (deviceListIterator != null) {
... ... @@ -674,10 +723,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
674 723 }
675 724  
676 725 RequestMessage msg = new RequestMessage();
677   - msg.setDeviceId(deviceId);
678   - msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
  726 + msg.setKey(key);
679 727 msg.setData(device);
680   - deferredResultHolder.invokeResult(msg);
  728 + deferredResultHolder.invokeAllResult(msg);
681 729 // 回复200 OK
682 730 responseAck(evt);
683 731 if (offLineDetector.isOnline(deviceId)) {
... ... @@ -701,11 +749,13 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
701 749 Device device = storager.queryVideoDevice(deviceId);
702 750 if (device == null) {
703 751 logger.warn("处理alarm设备报警信息未找到设备信息");
  752 + response404Ack(evt);
704 753 return;
705 754 }
706 755 Element rootElement = getRootElement(evt, device.getCharset());
707 756 Element deviceIdElement = rootElement.element("DeviceID");
708 757 String channelId = deviceIdElement.getText().toString();
  758 + String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId + channelId;
709 759 // 回复200 OK
710 760 responseAck(evt);
711 761  
... ... @@ -770,10 +820,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
770 820 logger.debug(json.toJSONString());
771 821 }
772 822 RequestMessage msg = new RequestMessage();
773   - msg.setDeviceId(deviceId);
774   - msg.setType(DeferredResultHolder.CALLBACK_CMD_ALARM);
  823 + msg.setKey(key);
775 824 msg.setData(json);
776   - deferredResultHolder.invokeResult(msg);
  825 + deferredResultHolder.invokeAllResult(msg);
777 826 }
778 827 } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
779 828 e.printStackTrace();
... ... @@ -787,10 +836,14 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
787 836 */
788 837 private void processMessageKeepAlive(RequestEvent evt) {
789 838 try {
790   - Element rootElement = getRootElement(evt);
791   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  839 +
  840 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  841 + // 查询设备是否存在
792 842 Device device = storager.queryVideoDevice(deviceId);
793 843  
  844 + Element rootElement = getRootElement(evt);
  845 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
  846 +
794 847 // 检查设备是否存在并在线, 不在线则设置为在线
795 848 if (device != null ) {
796 849 // 回复200 OK
... ... @@ -831,18 +884,29 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
831 884 */
832 885 private void processMessageRecordInfo(RequestEvent evt) {
833 886 try {
  887 +
  888 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  889 + // 查询设备是否存在
  890 + Device device = storager.queryVideoDevice(deviceId);
  891 + if (device == null) {
  892 + logger.warn("处理DeviceInfo设备信息Message时未找到设备信息");
  893 + response404Ack(evt);
  894 + return;
  895 + }
  896 +
834 897 // 回复200 OK
835 898 responseAck(evt);
836 899 String uuid = UUID.randomUUID().toString().replace("-", "");
837 900 RecordInfo recordInfo = new RecordInfo();
838 901 Element rootElement = getRootElement(evt);
839 902 Element deviceIdElement = rootElement.element("DeviceID");
840   - String deviceId = deviceIdElement.getText().toString();
841   - Device device = storager.queryVideoDevice(deviceId);
  903 + String channelId = deviceIdElement.getText().toString();
  904 + String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
842 905 if (device != null ) {
843 906 rootElement = getRootElement(evt, device.getCharset());
844 907 }
845 908 recordInfo.setDeviceId(deviceId);
  909 + recordInfo.setChannelId(channelId);
846 910 recordInfo.setName(XmlUtil.getText(rootElement, "Name"));
847 911 if (XmlUtil.getText(rootElement, "SumNum")== null || XmlUtil.getText(rootElement, "SumNum") =="") {
848 912 recordInfo.setSumNum(0);
... ... @@ -854,10 +918,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
854 918 if (recordListElement == null || recordInfo.getSumNum() == 0) {
855 919 logger.info("无录像数据");
856 920 RequestMessage msg = new RequestMessage();
857   - msg.setDeviceId(deviceId);
858   - msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO);
  921 + msg.setKey(key);
859 922 msg.setData(recordInfo);
860   - deferredResultHolder.invokeResult(msg);
  923 + deferredResultHolder.invokeAllResult(msg);
861 924 } else {
862 925 Iterator<Element> recordListIterator = recordListElement.elementIterator();
863 926 List<RecordItem> recordList = new ArrayList<RecordItem>();
... ... @@ -956,10 +1019,20 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
956 1019 */
957 1020 private void processMessageMediaStatus(RequestEvent evt){
958 1021 try {
  1022 +
  1023 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  1024 + // 查询设备是否存在
  1025 + Device device = storager.queryVideoDevice(deviceId);
  1026 + if (device == null) {
  1027 + logger.warn("处理DeviceInfo设备信息Message时未找到设备信息");
  1028 + response404Ack(evt);
  1029 + return;
  1030 + }
  1031 +
959 1032 // 回复200 OK
960 1033 responseAck(evt);
961 1034 Element rootElement = getRootElement(evt);
962   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  1035 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
963 1036 String NotifyType =XmlUtil.getText(rootElement, "NotifyType");
964 1037 if (NotifyType.equals("121")){
965 1038 logger.info("媒体播放完毕,通知关流");
... ... @@ -981,8 +1054,19 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
981 1054 */
982 1055 private void processMessageBroadcast(RequestEvent evt) {
983 1056 try {
  1057 +
  1058 + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
  1059 + // 查询设备是否存在
  1060 + Device device = storager.queryVideoDevice(deviceId);
  1061 + if (device == null) {
  1062 + logger.warn("处理DeviceInfo设备信息Message时未找到设备信息");
  1063 + response404Ack(evt);
  1064 + return;
  1065 + }
  1066 +
984 1067 Element rootElement = getRootElement(evt);
985   - String deviceId = XmlUtil.getText(rootElement, "DeviceID");
  1068 + String channelId = XmlUtil.getText(rootElement, "DeviceID");
  1069 + String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId + channelId;
986 1070 // 回复200 OK
987 1071 responseAck(evt);
988 1072 if (rootElement.getName().equals("Response")) {
... ... @@ -993,10 +1077,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
993 1077 logger.debug(json.toJSONString());
994 1078 }
995 1079 RequestMessage msg = new RequestMessage();
996   - msg.setDeviceId(deviceId);
997   - msg.setType(DeferredResultHolder.CALLBACK_CMD_BROADCAST);
  1080 + msg.setKey(key);
998 1081 msg.setData(json);
999   - deferredResultHolder.invokeResult(msg);
  1082 + deferredResultHolder.invokeAllResult(msg);
1000 1083 } else {
1001 1084 // 此处是上级发出的Broadcast指令
1002 1085 }
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -78,9 +78,11 @@ public class PlayServiceImpl implements IPlayService {
78 78 @Override
79 79 public PlayResult play(MediaServerItem mediaServerItem, String deviceId, String channelId, ZLMHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent) {
80 80 PlayResult playResult = new PlayResult();
  81 + RequestMessage msg = new RequestMessage();
  82 + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
  83 + msg.setKey(key);
  84 + msg.setId(playResult.getUuid());
81 85 if (mediaServerItem == null) {
82   - RequestMessage msg = new RequestMessage();
83   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + playResult.getUuid());
84 86 WVPResult wvpResult = new WVPResult();
85 87 wvpResult.setCode(-1);
86 88 wvpResult.setMsg("未找到可用的zlm");
... ... @@ -88,20 +90,19 @@ public class PlayServiceImpl implements IPlayService {
88 90 resultHolder.invokeResult(msg);
89 91 return playResult;
90 92 }
  93 +
91 94 Device device = storager.queryVideoDevice(deviceId);
92 95 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
93 96 playResult.setDevice(device);
94   - UUID uuid = UUID.randomUUID();
95   - playResult.setUuid(uuid.toString());
  97 + String uuid = UUID.randomUUID().toString();
  98 + playResult.setUuid(uuid);
96 99 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(userSetup.getPlayTimeout());
97 100 playResult.setResult(result);
98 101 // 录像查询以channelId作为deviceId查询
99   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid, result);
  102 + resultHolder.put(key, uuid, result);
100 103 // 超时处理
101 104 result.onTimeout(()->{
102 105 logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", deviceId, channelId));
103   - RequestMessage msg = new RequestMessage();
104   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + playResult.getUuid());
105 106 WVPResult wvpResult = new WVPResult();
106 107 wvpResult.setCode(-1);
107 108 SIPDialog dialog = streamSession.getDialog(deviceId, channelId);
... ... @@ -115,7 +116,8 @@ public class PlayServiceImpl implements IPlayService {
115 116 cmder.streamByeCmd(device.getDeviceId(), channelId);
116 117 // 释放rtpserver
117 118 mediaServerService.closeRTPServer(playResult.getDevice(), channelId);
118   - resultHolder.invokeResult(msg);
  119 + // 回复之前所有的点播请求
  120 + resultHolder.invokeAllResult(msg);
119 121 });
120 122 result.onCompletion(()->{
121 123 // 点播结束时调用截图接口
... ... @@ -169,15 +171,13 @@ public class PlayServiceImpl implements IPlayService {
169 171 }
170 172 }, (event) -> {
171 173 // 点播返回sip错误
172   - RequestMessage msg = new RequestMessage();
173   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
174 174 Response response = event.getResponse();
175 175 mediaServerService.closeRTPServer(playResult.getDevice(), channelId);
176 176 WVPResult wvpResult = new WVPResult();
177 177 wvpResult.setCode(-1);
178 178 wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
179 179 msg.setData(wvpResult);
180   - resultHolder.invokeResult(msg);
  180 + resultHolder.invokeAllResult(msg);
181 181 if (errorEvent != null) {
182 182 errorEvent.response(event);
183 183 }
... ... @@ -186,13 +186,11 @@ public class PlayServiceImpl implements IPlayService {
186 186 } else {
187 187 String streamId = streamInfo.getStreamId();
188 188 if (streamId == null) {
189   - RequestMessage msg = new RequestMessage();
190   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
191 189 WVPResult wvpResult = new WVPResult();
192 190 wvpResult.setCode(-1);
193 191 wvpResult.setMsg(String.format("点播失败, redis缓存streamId等于null"));
194 192 msg.setData(wvpResult);
195   - resultHolder.invokeResult(msg);
  193 + resultHolder.invokeAllResult(msg);
196 194 return playResult;
197 195 }
198 196 String mediaServerId = streamInfo.getMediaServerId();
... ... @@ -200,8 +198,6 @@ public class PlayServiceImpl implements IPlayService {
200 198  
201 199 JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId);
202 200 if (rtpInfo != null && rtpInfo.getBoolean("exist")) {
203   - RequestMessage msg = new RequestMessage();
204   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
205 201  
206 202 WVPResult wvpResult = new WVPResult();
207 203 wvpResult.setCode(0);
... ... @@ -209,7 +205,7 @@ public class PlayServiceImpl implements IPlayService {
209 205 wvpResult.setData(streamInfo);
210 206 msg.setData(wvpResult);
211 207  
212   - resultHolder.invokeResult(msg);
  208 + resultHolder.invokeAllResult(msg);
213 209 if (hookEvent != null) {
214 210 hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo)));
215 211 }
... ... @@ -229,15 +225,13 @@ public class PlayServiceImpl implements IPlayService {
229 225 onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid.toString());
230 226 }, (event) -> {
231 227 mediaServerService.closeRTPServer(playResult.getDevice(), channelId);
232   - RequestMessage msg = new RequestMessage();
233   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
234 228 Response response = event.getResponse();
235 229  
236 230 WVPResult wvpResult = new WVPResult();
237 231 wvpResult.setCode(-1);
238 232 wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
239 233 msg.setData(wvpResult);
240   - resultHolder.invokeResult(msg);
  234 + resultHolder.invokeAllResult(msg);
241 235 });
242 236 }
243 237 }
... ... @@ -248,7 +242,8 @@ public class PlayServiceImpl implements IPlayService {
248 242 @Override
249 243 public void onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) {
250 244 RequestMessage msg = new RequestMessage();
251   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  245 + msg.setId(uuid);
  246 + msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId);
252 247 StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid);
253 248 if (streamInfo != null) {
254 249 DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
... ... @@ -265,11 +260,11 @@ public class PlayServiceImpl implements IPlayService {
265 260 wvpResult.setData(streamInfo);
266 261 msg.setData(wvpResult);
267 262  
268   - resultHolder.invokeResult(msg);
  263 + resultHolder.invokeAllResult(msg);
269 264 } else {
270 265 logger.warn("设备预览API调用失败!");
271 266 msg.setData("设备预览API调用失败!");
272   - resultHolder.invokeResult(msg);
  267 + resultHolder.invokeAllResult(msg);
273 268 }
274 269 }
275 270  
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java
1 1 package com.genersoft.iot.vmp.vmanager.gb28181.MobilePosition;
2 2  
3 3 import java.util.List;
  4 +import java.util.UUID;
4 5  
5 6 import javax.sip.message.Response;
6 7  
... ... @@ -111,10 +112,13 @@ public class MobilePositionController {
111 112 @GetMapping("/realtime/{deviceId}")
112 113 public DeferredResult<ResponseEntity<MobilePosition>> realTimePosition(@PathVariable String deviceId) {
113 114 Device device = storager.queryVideoDevice(deviceId);
  115 + String uuid = UUID.randomUUID().toString();
  116 + String key = DeferredResultHolder.CALLBACK_CMD_MOBILEPOSITION + deviceId;
114 117 cmder.mobilePostitionQuery(device, event -> {
115 118 Response response = event.getResponse();
116 119 RequestMessage msg = new RequestMessage();
117   - msg.setId(DeferredResultHolder.CALLBACK_CMD_MOBILEPOSITION + deviceId);
  120 + msg.setId(uuid);
  121 + msg.setKey(key);
118 122 msg.setData(String.format("获取移动位置信息失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
119 123 resultHolder.invokeResult(msg);
120 124 });
... ... @@ -123,11 +127,12 @@ public class MobilePositionController {
123 127 logger.warn(String.format("获取移动位置信息超时"));
124 128 // 释放rtpserver
125 129 RequestMessage msg = new RequestMessage();
126   - msg.setId(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId);
  130 + msg.setId(uuid);
  131 + msg.setKey(key);
127 132 msg.setData("Timeout");
128 133 resultHolder.invokeResult(msg);
129 134 });
130   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId, result);
  135 + resultHolder.put(key, uuid, result);
131 136 return result;
132 137 }
133 138  
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
... ... @@ -28,6 +28,8 @@ import org.springframework.util.StringUtils;
28 28 import org.springframework.web.bind.annotation.*;
29 29 import org.springframework.web.context.request.async.DeferredResult;
30 30  
  31 +import java.util.UUID;
  32 +
31 33 @Api(tags = "国标设备配置")
32 34 @CrossOrigin
33 35 @RestController
... ... @@ -66,7 +68,7 @@ public class DeviceConfig {
66 68 @ApiImplicitParam(name = "heartBeatCount", value ="心跳计数" ,dataTypeClass = String.class),
67 69 })
68 70 public DeferredResult<ResponseEntity<String>> homePositionApi(@PathVariable String deviceId,
69   - @RequestParam(required = false) String channelId,
  71 + String channelId,
70 72 @RequestParam(required = false) String name,
71 73 @RequestParam(required = false) String expiration,
72 74 @RequestParam(required = false) String heartBeatInterval,
... ... @@ -75,10 +77,13 @@ public class DeviceConfig {
75 77 logger.debug("报警复位API调用");
76 78 }
77 79 Device device = storager.queryVideoDevice(deviceId);
  80 + String uuid = UUID.randomUUID().toString();
  81 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId;
78 82 cmder.deviceBasicConfigCmd(device, channelId, name, expiration, heartBeatInterval, heartBeatCount, event -> {
79 83 Response response = event.getResponse();
80 84 RequestMessage msg = new RequestMessage();
81   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  85 + msg.setId(uuid);
  86 + msg.setKey(key);
82 87 msg.setData(String.format("设备配置操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
83 88 resultHolder.invokeResult(msg);
84 89 });
... ... @@ -87,7 +92,8 @@ public class DeviceConfig {
87 92 logger.warn(String.format("设备配置操作超时, 设备未返回应答指令"));
88 93 // 释放rtpserver
89 94 RequestMessage msg = new RequestMessage();
90   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  95 + msg.setId(uuid);
  96 + msg.setKey(key);
91 97 JSONObject json = new JSONObject();
92 98 json.put("DeviceID", deviceId);
93 99 json.put("Status", "Timeout");
... ... @@ -95,7 +101,7 @@ public class DeviceConfig {
95 101 msg.setData(json); //("看守位控制操作超时, 设备未返回应答指令");
96 102 resultHolder.invokeResult(msg);
97 103 });
98   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + (StringUtils.isEmpty(channelId) ? deviceId : channelId), result);
  104 + resultHolder.put(key, uuid, result);
99 105 return result;
100 106 }
101 107  
... ... @@ -119,11 +125,14 @@ public class DeviceConfig {
119 125 if (logger.isDebugEnabled()) {
120 126 logger.debug("设备状态查询API调用");
121 127 }
  128 + String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (StringUtils.isEmpty(channelId) ? deviceId : channelId);
  129 + String uuid = UUID.randomUUID().toString();
122 130 Device device = storager.queryVideoDevice(deviceId);
123 131 cmder.deviceConfigQuery(device, channelId, configType, event -> {
124 132 Response response = event.getResponse();
125 133 RequestMessage msg = new RequestMessage();
126   - msg.setId(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  134 + msg.setId(uuid);
  135 + msg.setKey(key);
127 136 msg.setData(String.format("获取设备配置失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
128 137 resultHolder.invokeResult(msg);
129 138 });
... ... @@ -132,11 +141,12 @@ public class DeviceConfig {
132 141 logger.warn(String.format("获取设备配置超时"));
133 142 // 释放rtpserver
134 143 RequestMessage msg = new RequestMessage();
135   - msg.setId(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  144 + msg.setId(uuid);
  145 + msg.setKey(key);
136 146 msg.setData("Timeout. Device did not response to this command.");
137 147 resultHolder.invokeResult(msg);
138 148 });
139   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (StringUtils.isEmpty(channelId) ? deviceId : channelId), result);
  149 + resultHolder.put(key, uuid, result);
140 150 return result;
141 151 }
142 152  
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
... ... @@ -29,6 +29,8 @@ import org.springframework.util.StringUtils;
29 29 import org.springframework.web.bind.annotation.*;
30 30 import org.springframework.web.context.request.async.DeferredResult;
31 31  
  32 +import java.util.UUID;
  33 +
32 34 @Api(tags = "国标设备控制")
33 35 @CrossOrigin
34 36 @RestController
... ... @@ -89,28 +91,36 @@ public class DeviceControl {
89 91 })
90 92 @GetMapping("/record/{deviceId}/{recordCmdStr}")
91 93 public DeferredResult<ResponseEntity<String>> recordApi(@PathVariable String deviceId,
92   - @PathVariable String recordCmdStr, @RequestParam(required = false) String channelId) {
  94 + @PathVariable String recordCmdStr, String channelId) {
93 95 if (logger.isDebugEnabled()) {
94 96 logger.debug("开始/停止录像API调用");
95 97 }
96 98 Device device = storager.queryVideoDevice(deviceId);
97   - cmder.recordCmd(device, channelId, recordCmdStr, event -> {
98   - Response response = event.getResponse();
99   - RequestMessage msg = new RequestMessage();
100   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
101   - msg.setData(String.format("开始/停止录像操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
102   - resultHolder.invokeResult(msg);
103   - });
104   - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
  99 + String uuid = UUID.randomUUID().toString();
  100 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId;
  101 + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
105 102 result.onTimeout(() -> {
106 103 logger.warn(String.format("开始/停止录像操作超时, 设备未返回应答指令"));
107 104 // 释放rtpserver
108 105 RequestMessage msg = new RequestMessage();
109   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  106 + msg.setKey(key);
  107 + msg.setId(uuid);
110 108 msg.setData("Timeout. Device did not response to this command.");
111   - resultHolder.invokeResult(msg);
  109 + resultHolder.invokeAllResult(msg);
  110 + });
  111 + resultHolder.put(key, uuid, result);
  112 + if (resultHolder.exist(key, null)){
  113 + return result;
  114 + }
  115 + cmder.recordCmd(device, channelId, recordCmdStr, event -> {
  116 + Response response = event.getResponse();
  117 + RequestMessage msg = new RequestMessage();
  118 + msg.setId(uuid);
  119 + msg.setKey(key);
  120 + msg.setData(String.format("开始/停止录像操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
  121 + resultHolder.invokeAllResult(msg);
112 122 });
113   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId), result);
  123 +
114 124 return result;
115 125 }
116 126  
... ... @@ -123,32 +133,38 @@ public class DeviceControl {
123 133 @ApiOperation("布防/撤防命令")
124 134 @ApiImplicitParams({
125 135 @ApiImplicitParam(name = "deviceId", value = "设备ID", required = true, dataTypeClass = String.class),
  136 + @ApiImplicitParam(name = "channelId", value ="通道编码" ,dataTypeClass = String.class),
126 137 @ApiImplicitParam(name = "guardCmdStr", value ="命令, 可选值:SetGuard(布防),ResetGuard(撤防)", required = true,
127 138 dataTypeClass = String.class)
128 139 })
129 140 @GetMapping("/guard/{deviceId}/{guardCmdStr}")
130   - public DeferredResult<ResponseEntity<String>> guardApi(@PathVariable String deviceId, @PathVariable String guardCmdStr) {
  141 + public DeferredResult<ResponseEntity<String>> guardApi(@PathVariable String deviceId, String channelId, @PathVariable String guardCmdStr) {
131 142 if (logger.isDebugEnabled()) {
132 143 logger.debug("布防/撤防API调用");
133 144 }
134 145 Device device = storager.queryVideoDevice(deviceId);
  146 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId;
  147 + String uuid =UUID.randomUUID().toString();
135 148 cmder.guardCmd(device, guardCmdStr, event -> {
136 149 Response response = event.getResponse();
137 150 RequestMessage msg = new RequestMessage();
138   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId);
  151 + msg.setId(uuid);
  152 + msg.setKey(key);
139 153 msg.setData(String.format("布防/撤防操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
140 154 resultHolder.invokeResult(msg);
141 155 });
142 156 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
  157 + resultHolder.put(key, uuid, result);
143 158 result.onTimeout(() -> {
144 159 logger.warn(String.format("布防/撤防操作超时, 设备未返回应答指令"));
145 160 // 释放rtpserver
146 161 RequestMessage msg = new RequestMessage();
147   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId);
  162 + msg.setKey(key);
  163 + msg.setId(uuid);
148 164 msg.setData("Timeout. Device did not response to this command.");
149 165 resultHolder.invokeResult(msg);
150 166 });
151   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId, result);
  167 +
152 168 return result;
153 169 }
154 170  
... ... @@ -162,21 +178,25 @@ public class DeviceControl {
162 178 @ApiOperation("报警复位")
163 179 @ApiImplicitParams({
164 180 @ApiImplicitParam(name = "deviceId", value = "设备ID", required = true, dataTypeClass = String.class),
  181 + @ApiImplicitParam(name = "channelId", value ="通道编码" ,dataTypeClass = String.class),
165 182 @ApiImplicitParam(name = "alarmMethod", value ="报警方式", dataTypeClass = String.class),
166 183 @ApiImplicitParam(name = "alarmType", value ="报警类型", dataTypeClass = String.class),
167 184 })
168 185 @GetMapping("/reset_alarm/{deviceId}")
169   - public DeferredResult<ResponseEntity<String>> resetAlarmApi(@PathVariable String deviceId,
  186 + public DeferredResult<ResponseEntity<String>> resetAlarmApi(@PathVariable String deviceId, String channelId,
170 187 @RequestParam(required = false) String alarmMethod,
171 188 @RequestParam(required = false) String alarmType) {
172 189 if (logger.isDebugEnabled()) {
173 190 logger.debug("报警复位API调用");
174 191 }
175 192 Device device = storager.queryVideoDevice(deviceId);
  193 + String uuid = UUID.randomUUID().toString();
  194 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId;
176 195 cmder.alarmCmd(device, alarmMethod, alarmType, event -> {
177 196 Response response = event.getResponse();
178 197 RequestMessage msg = new RequestMessage();
179   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId);
  198 + msg.setId(uuid);
  199 + msg.setKey(key);
180 200 msg.setData(String.format("报警复位操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
181 201 resultHolder.invokeResult(msg);
182 202 });
... ... @@ -185,11 +205,12 @@ public class DeviceControl {
185 205 logger.warn(String.format("报警复位操作超时, 设备未返回应答指令"));
186 206 // 释放rtpserver
187 207 RequestMessage msg = new RequestMessage();
188   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId);
  208 + msg.setId(uuid);
  209 + msg.setKey(key);
189 210 msg.setData("Timeout. Device did not response to this command.");
190 211 resultHolder.invokeResult(msg);
191 212 });
192   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId, result);
  213 + resultHolder.put(key, uuid, result);
193 214 return result;
194 215 }
195 216  
... ... @@ -236,6 +257,7 @@ public class DeviceControl {
236 257 @ApiOperation("看守位控制")
237 258 @ApiImplicitParams({
238 259 @ApiImplicitParam(name = "deviceId", value = "设备ID", required = true, dataTypeClass = String.class),
  260 + @ApiImplicitParam(name = "channelId", value ="通道编码" ,dataTypeClass = String.class),
239 261 @ApiImplicitParam(name = "enabled", value = "是否开启看守位 1:开启,0:关闭", required = true, dataTypeClass = String.class),
240 262 @ApiImplicitParam(name = "resetTime", value = "自动归位时间间隔", dataTypeClass = String.class),
241 263 @ApiImplicitParam(name = "presetIndex", value = "调用预置位编号", dataTypeClass = String.class),
... ... @@ -246,15 +268,18 @@ public class DeviceControl {
246 268 @PathVariable String enabled,
247 269 @RequestParam(required = false) String resetTime,
248 270 @RequestParam(required = false) String presetIndex,
249   - @RequestParam(required = false) String channelId) {
  271 + String channelId) {
250 272 if (logger.isDebugEnabled()) {
251 273 logger.debug("报警复位API调用");
252 274 }
  275 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId);
  276 + String uuid = UUID.randomUUID().toString();
253 277 Device device = storager.queryVideoDevice(deviceId);
254 278 cmder.homePositionCmd(device, channelId, enabled, resetTime, presetIndex, event -> {
255 279 Response response = event.getResponse();
256 280 RequestMessage msg = new RequestMessage();
257   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  281 + msg.setId(uuid);
  282 + msg.setKey(key);
258 283 msg.setData(String.format("看守位控制操作失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
259 284 resultHolder.invokeResult(msg);
260 285 });
... ... @@ -263,7 +288,8 @@ public class DeviceControl {
263 288 logger.warn(String.format("看守位控制操作超时, 设备未返回应答指令"));
264 289 // 释放rtpserver
265 290 RequestMessage msg = new RequestMessage();
266   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  291 + msg.setId(uuid);
  292 + msg.setKey(key);
267 293 JSONObject json = new JSONObject();
268 294 json.put("DeviceID", deviceId);
269 295 json.put("Status", "Timeout");
... ... @@ -271,7 +297,7 @@ public class DeviceControl {
271 297 msg.setData(json); //("看守位控制操作超时, 设备未返回应答指令");
272 298 resultHolder.invokeResult(msg);
273 299 });
274   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (StringUtils.isEmpty(channelId) ? deviceId : channelId), result);
  300 + resultHolder.put(key, uuid, result);
275 301 return result;
276 302 }
277 303 }
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
... ... @@ -24,6 +24,7 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
24 24  
25 25 import javax.sip.message.Response;
26 26 import java.io.UnsupportedEncodingException;
  27 +import java.util.UUID;
27 28  
28 29 @Api(tags = "国标设备查询", value = "国标设备查询")
29 30 @SuppressWarnings("rawtypes")
... ... @@ -143,23 +144,32 @@ public class DeviceQuery {
143 144 logger.debug("设备通道信息同步API调用,deviceId:" + deviceId);
144 145 }
145 146 Device device = storager.queryVideoDevice(deviceId);
146   - cmder.catalogQuery(device, event -> {
147   - Response response = event.getResponse();
148   - RequestMessage msg = new RequestMessage();
149   - msg.setId(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId);
150   - msg.setData(String.format("同步通道失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
151   - resultHolder.invokeResult(msg);
152   - });
153   - DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(15*1000L);
  147 + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
  148 + String uuid = UUID.randomUUID().toString();
  149 + DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(15*1000L);
154 150 result.onTimeout(()->{
155 151 logger.warn(String.format("设备通道信息同步超时"));
156 152 // 释放rtpserver
157 153 RequestMessage msg = new RequestMessage();
158   - msg.setId(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId);
  154 + msg.setKey(key);
  155 + msg.setId(uuid);
159 156 msg.setData("Timeout");
160   - resultHolder.invokeResult(msg);
  157 + resultHolder.invokeAllResult(msg);
161 158 });
162   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId, result);
  159 + // 等待其他相同请求返回时一起返回
  160 + if (resultHolder.exist(key, null)) {
  161 + return result;
  162 + }
  163 + cmder.catalogQuery(device, event -> {
  164 + Response response = event.getResponse();
  165 + RequestMessage msg = new RequestMessage();
  166 + msg.setKey(key);
  167 + msg.setId(uuid);
  168 + msg.setData(String.format("同步通道失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
  169 + resultHolder.invokeAllResult(msg);
  170 + });
  171 +
  172 + resultHolder.put(key, uuid, result);
163 173 return result;
164 174 }
165 175  
... ... @@ -316,10 +326,13 @@ public class DeviceQuery {
316 326 logger.debug("设备状态查询API调用");
317 327 }
318 328 Device device = storager.queryVideoDevice(deviceId);
  329 + String uuid = UUID.randomUUID().toString();
  330 + String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId;
319 331 cmder.deviceStatusQuery(device, event -> {
320 332 Response response = event.getResponse();
321 333 RequestMessage msg = new RequestMessage();
322   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId);
  334 + msg.setId(uuid);
  335 + msg.setKey(key);
323 336 msg.setData(String.format("获取设备状态失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
324 337 resultHolder.invokeResult(msg);
325 338 });
... ... @@ -328,11 +341,12 @@ public class DeviceQuery {
328 341 logger.warn(String.format("获取设备状态超时"));
329 342 // 释放rtpserver
330 343 RequestMessage msg = new RequestMessage();
331   - msg.setId(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId);
  344 + msg.setId(uuid);
  345 + msg.setKey(key);
332 346 msg.setData("Timeout. Device did not response to this command.");
333 347 resultHolder.invokeResult(msg);
334 348 });
335   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId, result);
  349 + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId, uuid, result);
336 350 return result;
337 351 }
338 352  
... ... @@ -369,10 +383,13 @@ public class DeviceQuery {
369 383 logger.debug("设备报警查询API调用");
370 384 }
371 385 Device device = storager.queryVideoDevice(deviceId);
  386 + String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId;
  387 + String uuid = UUID.randomUUID().toString();
372 388 cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> {
373 389 Response response = event.getResponse();
374 390 RequestMessage msg = new RequestMessage();
375   - msg.setId(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId);
  391 + msg.setId(uuid);
  392 + msg.setKey(key);
376 393 msg.setData(String.format("设备报警查询失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
377 394 resultHolder.invokeResult(msg);
378 395 });
... ... @@ -381,11 +398,12 @@ public class DeviceQuery {
381 398 logger.warn(String.format("设备报警查询超时"));
382 399 // 释放rtpserver
383 400 RequestMessage msg = new RequestMessage();
384   - msg.setId(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId);
  401 + msg.setId(uuid);
  402 + msg.setKey(key);
385 403 msg.setData("设备报警查询超时");
386 404 resultHolder.invokeResult(msg);
387 405 });
388   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId, result);
  406 + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId, uuid, result);
389 407 return result;
390 408 }
391 409  
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
... ... @@ -103,28 +103,31 @@ public class PlayController {
103 103  
104 104 logger.debug(String.format("设备预览/回放停止API调用,streamId:%s_%s", deviceId, channelId ));
105 105  
106   - UUID uuid = UUID.randomUUID();
  106 + String uuid = UUID.randomUUID().toString();
107 107 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
108 108  
109 109 // 录像查询以channelId作为deviceId查询
110   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_STOP + uuid, result);
  110 + String key = DeferredResultHolder.CALLBACK_CMD_STOP + deviceId + channelId;
  111 + resultHolder.put(key, uuid, result);
111 112 Device device = storager.queryVideoDevice(deviceId);
112 113 cmder.streamByeCmd(deviceId, channelId, (event) -> {
113 114 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
114 115 if (streamInfo == null) {
115 116 RequestMessage msg = new RequestMessage();
116   - msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
  117 + msg.setId(uuid);
  118 + msg.setKey(key);
117 119 msg.setData("点播未找到");
118   - resultHolder.invokeResult(msg);
  120 + resultHolder.invokeAllResult(msg);
119 121 storager.stopPlay(deviceId, channelId);
120 122 }else {
121 123 redisCatchStorage.stopPlay(streamInfo);
122 124 storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
123 125 RequestMessage msg = new RequestMessage();
124   - msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
  126 + msg.setId(uuid);
  127 + msg.setKey(key);
125 128 //Response response = event.getResponse();
126 129 msg.setData(String.format("success"));
127   - resultHolder.invokeResult(msg);
  130 + resultHolder.invokeAllResult(msg);
128 131 }
129 132 mediaServerService.closeRTPServer(device, channelId);
130 133 });
... ... @@ -134,24 +137,27 @@ public class PlayController {
134 137 json.put("deviceId", deviceId);
135 138 json.put("channelId", channelId);
136 139 RequestMessage msg = new RequestMessage();
137   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  140 + msg.setId(uuid);
  141 + msg.setKey(key);
138 142 msg.setData(json.toString());
139   - resultHolder.invokeResult(msg);
  143 + resultHolder.invokeAllResult(msg);
140 144 } else {
141 145 logger.warn("设备预览/回放停止API调用失败!");
142 146 RequestMessage msg = new RequestMessage();
143   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  147 + msg.setId(uuid);
  148 + msg.setKey(key);
144 149 msg.setData("streamId null");
145   - resultHolder.invokeResult(msg);
  150 + resultHolder.invokeAllResult(msg);
146 151 }
147 152  
148 153 // 超时处理
149 154 result.onTimeout(()->{
150 155 logger.warn(String.format("设备预览/回放停止超时,deviceId/channelId:%s_%s ", deviceId, channelId));
151 156 RequestMessage msg = new RequestMessage();
152   - msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
  157 + msg.setId(uuid);
  158 + msg.setKey(key);
153 159 msg.setData("Timeout");
154   - resultHolder.invokeResult(msg);
  160 + resultHolder.invokeAllResult(msg);
155 161 });
156 162 return result;
157 163 }
... ... @@ -259,10 +265,18 @@ public class PlayController {
259 265 }
260 266 Device device = storager.queryVideoDevice(deviceId);
261 267 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
  268 + String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId;
  269 + if (resultHolder.exist(key, null)) {
  270 + result.setResult(new ResponseEntity<>("设备使用中",HttpStatus.OK));
  271 + return result;
  272 + }
  273 + String uuid = UUID.randomUUID().toString();
262 274 if (device == null) {
263   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId, result);
  275 +
  276 + resultHolder.put(key, key, result);
264 277 RequestMessage msg = new RequestMessage();
265   - msg.setId(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId);
  278 + msg.setKey(key);
  279 + msg.setId(uuid);
266 280 JSONObject json = new JSONObject();
267 281 json.put("DeviceID", deviceId);
268 282 json.put("CmdType", "Broadcast");
... ... @@ -275,7 +289,8 @@ public class PlayController {
275 289 cmder.audioBroadcastCmd(device, (event) -> {
276 290 Response response = event.getResponse();
277 291 RequestMessage msg = new RequestMessage();
278   - msg.setId(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId);
  292 + msg.setKey(key);
  293 + msg.setId(uuid);
279 294 JSONObject json = new JSONObject();
280 295 json.put("DeviceID", deviceId);
281 296 json.put("CmdType", "Broadcast");
... ... @@ -288,7 +303,8 @@ public class PlayController {
288 303 result.onTimeout(() -> {
289 304 logger.warn(String.format("语音广播操作超时, 设备未返回应答指令"));
290 305 RequestMessage msg = new RequestMessage();
291   - msg.setId(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId);
  306 + msg.setKey(key);
  307 + msg.setId(uuid);
292 308 JSONObject json = new JSONObject();
293 309 json.put("DeviceID", deviceId);
294 310 json.put("CmdType", "Broadcast");
... ... @@ -297,7 +313,7 @@ public class PlayController {
297 313 msg.setData(json);
298 314 resultHolder.invokeResult(msg);
299 315 });
300   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId, result);
  316 + resultHolder.put(key, uuid, result);
301 317 return result;
302 318 }
303 319  
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java
... ... @@ -76,30 +76,37 @@ public class DownloadController {
76 76 if (logger.isDebugEnabled()) {
77 77 logger.debug(String.format("历史媒体下载 API调用,deviceId:%s,channelId:%s,downloadSpeed:%s", deviceId, channelId, downloadSpeed));
78 78 }
79   - UUID uuid = UUID.randomUUID();
  79 + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId + startTime + endTime;
  80 + String uuid = UUID.randomUUID().toString();
80 81 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(30000L);
81 82 // 超时处理
82 83 result.onTimeout(()->{
83 84 logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId));
84 85 RequestMessage msg = new RequestMessage();
85   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  86 + msg.setId(uuid);
  87 + msg.setKey(key);
86 88 msg.setData("Timeout");
87   - resultHolder.invokeResult(msg);
  89 + resultHolder.invokeAllResult(msg);
88 90 });
  91 + resultHolder.put(key, uuid, result);
  92 + if(resultHolder.exist(key, null)) {
  93 + return result;
  94 + }
89 95 Device device = storager.queryVideoDevice(deviceId);
90 96 StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, channelId);
91 97 if (streamInfo != null) {
92 98 // 停止之前的下载
93 99 cmder.streamByeCmd(deviceId, channelId);
94 100 }
95   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid, result);
  101 +
96 102 MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
97 103 if (newMediaServerItem == null) {
98 104 logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId));
99 105 RequestMessage msg = new RequestMessage();
100   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  106 + msg.setId(uuid);
  107 + msg.setKey(key);
101 108 msg.setData("Timeout");
102   - resultHolder.invokeResult(msg);
  109 + resultHolder.invokeAllResult(msg);
103 110 return result;
104 111 }
105 112  
... ... @@ -111,9 +118,10 @@ public class DownloadController {
111 118 }, event -> {
112 119 Response response = event.getResponse();
113 120 RequestMessage msg = new RequestMessage();
114   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  121 + msg.setId(uuid);
  122 + msg.setKey(key);
115 123 msg.setData(String.format("回放失败, 错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
116   - resultHolder.invokeResult(msg);
  124 + resultHolder.invokeAllResult(msg);
117 125 });
118 126  
119 127 return result;
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java
... ... @@ -76,9 +76,9 @@ public class PlaybackController {
76 76 if (logger.isDebugEnabled()) {
77 77 logger.debug(String.format("设备回放 API调用,deviceId:%s ,channelId:%s", deviceId, channelId));
78 78 }
79   - UUID uuid = UUID.randomUUID();
  79 + String uuid = UUID.randomUUID().toString();
  80 + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId + startTime + endTime;
80 81 DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(30000L);
81   -
82 82 Device device = storager.queryVideoDevice(deviceId);
83 83 if (device == null) {
84 84 result.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST));
... ... @@ -91,7 +91,8 @@ public class PlaybackController {
91 91 result.onTimeout(()->{
92 92 logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId));
93 93 RequestMessage msg = new RequestMessage();
94   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  94 + msg.setId(uuid);
  95 + msg.setKey(key);
95 96 msg.setData("Timeout");
96 97 resultHolder.invokeResult(msg);
97 98 });
... ... @@ -101,12 +102,13 @@ public class PlaybackController {
101 102 // 停止之前的回放
102 103 cmder.streamByeCmd(deviceId, channelId);
103 104 }
104   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid, result);
  105 + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId + startTime + endTime, uuid, result);
105 106  
106 107 if (newMediaServerItem == null) {
107 108 logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId));
108 109 RequestMessage msg = new RequestMessage();
109   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  110 + msg.setId(uuid);
  111 + msg.setKey(key);
110 112 msg.setData("Timeout");
111 113 resultHolder.invokeResult(msg);
112 114 return result;
... ... @@ -118,7 +120,8 @@ public class PlaybackController {
118 120 }, event -> {
119 121 Response response = event.getResponse();
120 122 RequestMessage msg = new RequestMessage();
121   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PLAY + uuid);
  123 + msg.setId(uuid);
  124 + msg.setKey(key);
122 125 msg.setData(String.format("回放失败, 错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
123 126 resultHolder.invokeResult(msg);
124 127 });
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java
... ... @@ -21,6 +21,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
21 21 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
22 22 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
23 23  
  24 +import java.util.UUID;
  25 +
24 26 @Api(tags = "云台控制")
25 27 @CrossOrigin
26 28 @RestController
... ... @@ -101,23 +103,31 @@ public class PtzController {
101 103 logger.debug("设备预置位查询API调用");
102 104 }
103 105 Device device = storager.queryVideoDevice(deviceId);
104   - cmder.presetQuery(device, channelId, event -> {
105   - Response response = event.getResponse();
106   - RequestMessage msg = new RequestMessage();
107   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
108   - msg.setData(String.format("获取设备预置位失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
109   - resultHolder.invokeResult(msg);
110   - });
111   - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L);
  106 + String uuid = UUID.randomUUID().toString();
  107 + String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (StringUtils.isEmpty(channelId) ? deviceId : channelId);
  108 + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L);
112 109 result.onTimeout(()->{
113 110 logger.warn(String.format("获取设备预置位超时"));
114 111 // 释放rtpserver
115 112 RequestMessage msg = new RequestMessage();
116   - msg.setId(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (StringUtils.isEmpty(channelId) ? deviceId : channelId));
  113 + msg.setId(uuid);
  114 + msg.setKey(key);
117 115 msg.setData("获取设备预置位超时");
118 116 resultHolder.invokeResult(msg);
119 117 });
120   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + (StringUtils.isEmpty(channelId) ? deviceId : channelId), result);
  118 + resultHolder.put(key, uuid, result);
  119 + if (resultHolder.exist(key, null)) {
  120 + return result;
  121 + }
  122 + cmder.presetQuery(device, channelId, event -> {
  123 + Response response = event.getResponse();
  124 + RequestMessage msg = new RequestMessage();
  125 + msg.setId(uuid);
  126 + msg.setKey(key);
  127 + msg.setData(String.format("获取设备预置位失败,错误码: %s, %s", response.getStatusCode(), response.getReasonPhrase()));
  128 + resultHolder.invokeResult(msg);
  129 + });
  130 +
121 131 return result;
122 132 }
123 133 }
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
... ... @@ -22,6 +22,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
22 22 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
23 23 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
24 24  
  25 +import java.util.UUID;
  26 +
25 27 @Api(tags = "国标录像")
26 28 @CrossOrigin
27 29 @RestController
... ... @@ -56,13 +58,15 @@ public class GBRecordController {
56 58 Device device = storager.queryVideoDevice(deviceId);
57 59 cmder.recordInfoQuery(device, channelId, startTime, endTime);
58 60 // 指定超时时间 1分钟30秒
59   - DeferredResult<ResponseEntity<RecordInfo>> result = new DeferredResult<ResponseEntity<RecordInfo>>(90*1000L);
  61 + DeferredResult<ResponseEntity<RecordInfo>> result = new DeferredResult<>(90*1000L);
  62 + String uuid = UUID.randomUUID().toString();
  63 + String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
60 64 // 录像查询以channelId作为deviceId查询
61   - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_RECORDINFO+channelId, result);
  65 + resultHolder.put(key, uuid, result);
62 66 result.onTimeout(()->{
63 67 RequestMessage msg = new RequestMessage();
64   - msg.setDeviceId(deviceId);
65   - msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO);
  68 + msg.setId(uuid);
  69 + msg.setKey(key);
66 70 msg.setData("timeout");
67 71 resultHolder.invokeResult(msg);
68 72 });
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/onvif/ONVIFController.java
... ... @@ -40,17 +40,18 @@ public class ONVIFController {
40 40 @ResponseBody
41 41 public DeferredResult<ResponseEntity<WVPResult>> search(@RequestParam(required = false)Integer timeout){
42 42 DeferredResult<ResponseEntity<WVPResult>> result = new DeferredResult<>(timeout + 10L);
43   - UUID uuid = UUID.randomUUID();
  43 + String uuid = UUID.randomUUID().toString();
44 44 result.onTimeout(()->{
45 45 RequestMessage msg = new RequestMessage();
46   - msg.setId(DeferredResultHolder.CALLBACK_ONVIF + uuid);
  46 + msg.setKey(DeferredResultHolder.CALLBACK_ONVIF );
  47 + msg.setId(uuid);
47 48 WVPResult<String> wvpResult = new WVPResult();
48 49 wvpResult.setCode(0);
49 50 wvpResult.setMsg("搜索超时");
50 51 msg.setData(wvpResult);
51 52 resultHolder.invokeResult(msg);
52 53 });
53   - resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF + uuid, result);
  54 + resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF, uuid, result);
54 55  
55 56 onvifServer.search(timeout, (errorCode, onvifDevices) ->{
56 57 RequestMessage msg = new RequestMessage();
... ... @@ -87,17 +88,18 @@ public class ONVIFController {
87 88 ){
88 89  
89 90 DeferredResult<ResponseEntity<WVPResult>> result = new DeferredResult<>(timeout + 10L);
90   - UUID uuid = UUID.randomUUID();
  91 + String uuid = UUID.randomUUID().toString();
91 92 result.onTimeout(()->{
92 93 RequestMessage msg = new RequestMessage();
93   - msg.setId(DeferredResultHolder.CALLBACK_ONVIF + uuid);
  94 + msg.setId(uuid);
  95 + msg.setKey(DeferredResultHolder.CALLBACK_ONVIF);
94 96 WVPResult<String> wvpResult = new WVPResult();
95 97 wvpResult.setCode(0);
96 98 wvpResult.setMsg("获取onvif的rtsp地址超时");
97 99 msg.setData(wvpResult);
98 100 resultHolder.invokeResult(msg);
99 101 });
100   - resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF + uuid, result);
  102 + resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF, uuid, result);
101 103 OnvifDevice onvifDevice = new OnvifDevice(hostname, username, password);
102 104 onvifServer.getRTSPUrl(timeout, onvifDevice, (errorCode, url) ->{
103 105 RequestMessage msg = new RequestMessage();
... ...
web_src/src/components/MediaServerManger.vue
... ... @@ -127,7 +127,6 @@
127 127 }
128 128 }
129 129  
130   - console.log("aadada: "+ resultVal)
131 130 return resultVal;
132 131 },
133 132 dateFormat: function(/** timestamp=0 **/) {
... ...