648540858
2022-04-12 3955e6ed53d450f8faf488d4b74ba0c0c83c5aaa
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -4,6 +4,7 @@
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -18,6 +19,7 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.kxml2.wap.wv.WV;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -149,49 +151,30 @@
         @ApiImplicitParam(name="deviceId", value = "设备id", required = true, dataTypeClass = String.class),
   })
   @PostMapping("/devices/{deviceId}/sync")
   public DeferredResult<ResponseEntity<Device>> devicesSync(@PathVariable String deviceId){
   public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){
      
      if (logger.isDebugEnabled()) {
         logger.debug("设备通道信息同步API调用,deviceId:" + deviceId);
      }
      Device device = storager.queryVideoDevice(deviceId);
      String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId;
      String uuid = UUID.randomUUID().toString();
      // 默认超时时间为30分钟
      DeferredResult<ResponseEntity<Device>> result = new DeferredResult<ResponseEntity<Device>>(30*60*1000L);
      result.onTimeout(()->{
         logger.warn("设备[{}]通道信息同步超时", deviceId);
         // 释放rtpserver
         RequestMessage msg = new RequestMessage();
         msg.setKey(key);
         msg.setId(uuid);
         WVPResult<Object> wvpResult = new WVPResult<>();
         wvpResult.setCode(-1);
         wvpResult.setData(device);
         wvpResult.setMsg("更新超时");
         msg.setData(wvpResult);
         resultHolder.invokeAllResult(msg);
      });
      // 等待其他相同请求返回时一起返回
      if (resultHolder.exist(key, null)) {
         resultHolder.put(key, uuid, result);
         return result;
      }else {
         cmder.catalogQuery(device, event -> {
            RequestMessage msg = new RequestMessage();
            msg.setKey(key);
            msg.setId(uuid);
            WVPResult<Object> wvpResult = new WVPResult<>();
            wvpResult.setCode(-1);
            wvpResult.setData(device);
            wvpResult.setMsg(String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg));
            msg.setData(wvpResult);
            resultHolder.invokeAllResult(msg);
         });
         resultHolder.put(key, uuid, result);
         return result;
      SyncStatus syncStatus = deviceService.getChannelSyncStatus(deviceId);
      // 已存在则返回进度
      if (syncStatus != null && syncStatus.getErrorMsg() == null) {
         WVPResult<SyncStatus> wvpResult = new WVPResult<>();
         wvpResult.setCode(0);
         wvpResult.setData(syncStatus);
         return wvpResult;
      }
      SyncStatus syncStatusReady = new SyncStatus();
      deviceService.setChannelSyncReady(deviceId);
      cmder.catalogQuery(device, event -> {
         String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg);
         deviceService.setChannelSyncEnd(deviceId, errorMsg);
      });
      WVPResult<SyncStatus> wvpResult = new WVPResult<>();
      wvpResult.setCode(0);
      wvpResult.setMsg("开始同步");
      return wvpResult;
   }
   /**
@@ -468,4 +451,22 @@
   public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) {
      return WVPResult.Data(storager.tree(deviceId));
   }
   @GetMapping("/{deviceId}/sync_status")
   @ApiOperation(value = "获取通道同步进度", notes = "获取通道同步进度")
   public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) {
      SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId);
      WVPResult<SyncStatus> wvpResult = new WVPResult<>();
      if (channelSyncStatus == null) {
         wvpResult.setCode(-1);
         wvpResult.setMsg("同步尚未开始");
      }else {
         wvpResult.setCode(0);
         wvpResult.setData(channelSyncStatus);
         if (channelSyncStatus.getErrorMsg() != null) {
            wvpResult.setMsg(channelSyncStatus.getErrorMsg());
         }
      }
      return wvpResult;
   }
}