Commit 0dc1807f621ce9077b58dff40ad4485c9a3d6c40
1 parent
25102229
优化通道同步添加对SN的判断,精简代码
Showing
11 changed files
with
121 additions
and
106 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
| @@ -4,6 +4,7 @@ import java.util.Date; | @@ -4,6 +4,7 @@ import java.util.Date; | ||
| 4 | import java.util.List; | 4 | import java.util.List; |
| 5 | 5 | ||
| 6 | public class CatalogData { | 6 | public class CatalogData { |
| 7 | + private int sn; // 命令序列号 | ||
| 7 | private int total; | 8 | private int total; |
| 8 | private List<DeviceChannel> channelList; | 9 | private List<DeviceChannel> channelList; |
| 9 | private Date lastTime; | 10 | private Date lastTime; |
| @@ -15,6 +16,15 @@ public class CatalogData { | @@ -15,6 +16,15 @@ public class CatalogData { | ||
| 15 | } | 16 | } |
| 16 | private CatalogDataStatus status; | 17 | private CatalogDataStatus status; |
| 17 | 18 | ||
| 19 | + | ||
| 20 | + public int getSn() { | ||
| 21 | + return sn; | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + public void setSn(int sn) { | ||
| 25 | + this.sn = sn; | ||
| 26 | + } | ||
| 27 | + | ||
| 18 | public int getTotal() { | 28 | public int getTotal() { |
| 19 | return total; | 29 | return total; |
| 20 | } | 30 | } |
src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
| @@ -54,6 +54,7 @@ public class OnlineEventListener implements ApplicationListener<OnlineEvent> { | @@ -54,6 +54,7 @@ public class OnlineEventListener implements ApplicationListener<OnlineEvent> { | ||
| 54 | @Autowired | 54 | @Autowired |
| 55 | private SIPCommander cmder; | 55 | private SIPCommander cmder; |
| 56 | 56 | ||
| 57 | + | ||
| 57 | private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | 58 | private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| 58 | 59 | ||
| 59 | @Override | 60 | @Override |
| @@ -76,7 +77,7 @@ public class OnlineEventListener implements ApplicationListener<OnlineEvent> { | @@ -76,7 +77,7 @@ public class OnlineEventListener implements ApplicationListener<OnlineEvent> { | ||
| 76 | if (deviceInStore == null) { //第一次上线 | 77 | if (deviceInStore == null) { //第一次上线 |
| 77 | logger.info("[{}] 首次注册,查询设备信息以及通道信息", device.getDeviceId()); | 78 | logger.info("[{}] 首次注册,查询设备信息以及通道信息", device.getDeviceId()); |
| 78 | cmder.deviceInfoQuery(device); | 79 | cmder.deviceInfoQuery(device); |
| 79 | - cmder.catalogQuery(device, null); | 80 | + deviceService.sync(device); |
| 80 | } | 81 | } |
| 81 | break; | 82 | break; |
| 82 | // 设备主动发送心跳触发的在线事件 | 83 | // 设备主动发送心跳触发的在线事件 |
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
| @@ -26,28 +26,35 @@ public class CatalogDataCatch { | @@ -26,28 +26,35 @@ public class CatalogDataCatch { | ||
| 26 | @Autowired | 26 | @Autowired |
| 27 | private IVideoManagerStorage storager; | 27 | private IVideoManagerStorage storager; |
| 28 | 28 | ||
| 29 | - public void addReady(String key) { | ||
| 30 | - CatalogData catalogData = data.get(key); | 29 | + public void addReady(Device device, int sn ) { |
| 30 | + CatalogData catalogData = data.get(device.getDeviceId()); | ||
| 31 | if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) { | 31 | if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) { |
| 32 | catalogData = new CatalogData(); | 32 | catalogData = new CatalogData(); |
| 33 | catalogData.setChannelList(new ArrayList<>()); | 33 | catalogData.setChannelList(new ArrayList<>()); |
| 34 | + catalogData.setDevice(device); | ||
| 35 | + catalogData.setSn(sn); | ||
| 34 | catalogData.setStatus(CatalogData.CatalogDataStatus.ready); | 36 | catalogData.setStatus(CatalogData.CatalogDataStatus.ready); |
| 35 | catalogData.setLastTime(new Date(System.currentTimeMillis())); | 37 | catalogData.setLastTime(new Date(System.currentTimeMillis())); |
| 36 | - data.put(key, catalogData); | 38 | + data.put(device.getDeviceId(), catalogData); |
| 37 | } | 39 | } |
| 38 | } | 40 | } |
| 39 | 41 | ||
| 40 | - public void put(String key, int total, Device device, List<DeviceChannel> deviceChannelList) { | ||
| 41 | - CatalogData catalogData = data.get(key); | 42 | + public void put(String deviceId, int sn, int total, Device device, List<DeviceChannel> deviceChannelList) { |
| 43 | + CatalogData catalogData = data.get(deviceId); | ||
| 42 | if (catalogData == null) { | 44 | if (catalogData == null) { |
| 43 | catalogData = new CatalogData(); | 45 | catalogData = new CatalogData(); |
| 46 | + catalogData.setSn(sn); | ||
| 44 | catalogData.setTotal(total); | 47 | catalogData.setTotal(total); |
| 45 | catalogData.setDevice(device); | 48 | catalogData.setDevice(device); |
| 46 | catalogData.setChannelList(new ArrayList<>()); | 49 | catalogData.setChannelList(new ArrayList<>()); |
| 47 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); | 50 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); |
| 48 | catalogData.setLastTime(new Date(System.currentTimeMillis())); | 51 | catalogData.setLastTime(new Date(System.currentTimeMillis())); |
| 49 | - data.put(key, catalogData); | 52 | + data.put(deviceId, catalogData); |
| 50 | }else { | 53 | }else { |
| 54 | + // 同一个设备的通道同步请求只考虑一个,其他的直接忽略 | ||
| 55 | + if (catalogData.getSn() != sn) { | ||
| 56 | + return; | ||
| 57 | + } | ||
| 51 | catalogData.setTotal(total); | 58 | catalogData.setTotal(total); |
| 52 | catalogData.setDevice(device); | 59 | catalogData.setDevice(device); |
| 53 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); | 60 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); |
| @@ -56,20 +63,20 @@ public class CatalogDataCatch { | @@ -56,20 +63,20 @@ public class CatalogDataCatch { | ||
| 56 | } | 63 | } |
| 57 | } | 64 | } |
| 58 | 65 | ||
| 59 | - public List<DeviceChannel> get(String key) { | ||
| 60 | - CatalogData catalogData = data.get(key); | 66 | + public List<DeviceChannel> get(String deviceId) { |
| 67 | + CatalogData catalogData = data.get(deviceId); | ||
| 61 | if (catalogData == null) return null; | 68 | if (catalogData == null) return null; |
| 62 | return catalogData.getChannelList(); | 69 | return catalogData.getChannelList(); |
| 63 | } | 70 | } |
| 64 | 71 | ||
| 65 | - public int getTotal(String key) { | ||
| 66 | - CatalogData catalogData = data.get(key); | 72 | + public int getTotal(String deviceId) { |
| 73 | + CatalogData catalogData = data.get(deviceId); | ||
| 67 | if (catalogData == null) return 0; | 74 | if (catalogData == null) return 0; |
| 68 | return catalogData.getTotal(); | 75 | return catalogData.getTotal(); |
| 69 | } | 76 | } |
| 70 | 77 | ||
| 71 | - public SyncStatus getSyncStatus(String key) { | ||
| 72 | - CatalogData catalogData = data.get(key); | 78 | + public SyncStatus getSyncStatus(String deviceId) { |
| 79 | + CatalogData catalogData = data.get(deviceId); | ||
| 73 | if (catalogData == null) return null; | 80 | if (catalogData == null) return null; |
| 74 | SyncStatus syncStatus = new SyncStatus(); | 81 | SyncStatus syncStatus = new SyncStatus(); |
| 75 | syncStatus.setCurrent(catalogData.getChannelList().size()); | 82 | syncStatus.setCurrent(catalogData.getChannelList().size()); |
| @@ -78,10 +85,6 @@ public class CatalogDataCatch { | @@ -78,10 +85,6 @@ public class CatalogDataCatch { | ||
| 78 | return syncStatus; | 85 | return syncStatus; |
| 79 | } | 86 | } |
| 80 | 87 | ||
| 81 | - public void del(String key) { | ||
| 82 | - data.remove(key); | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | @Scheduled(fixedRate = 5 * 1000) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时 | 88 | @Scheduled(fixedRate = 5 * 1000) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时 |
| 86 | private void timerTask(){ | 89 | private void timerTask(){ |
| 87 | Set<String> keys = data.keySet(); | 90 | Set<String> keys = data.keySet(); |
| @@ -92,23 +95,30 @@ public class CatalogDataCatch { | @@ -92,23 +95,30 @@ public class CatalogDataCatch { | ||
| 92 | Calendar calendarBefore30S = Calendar.getInstance(); | 95 | Calendar calendarBefore30S = Calendar.getInstance(); |
| 93 | calendarBefore30S.setTime(new Date()); | 96 | calendarBefore30S.setTime(new Date()); |
| 94 | calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30); | 97 | calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30); |
| 95 | - for (String key : keys) { | ||
| 96 | - CatalogData catalogData = data.get(key); | ||
| 97 | - if (catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 超过五秒收不到消息任务超时, 只更新这一部分数据 | ||
| 98 | - storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList()); | ||
| 99 | - String errorMsg = "更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条"; | 98 | + for (String deviceId : keys) { |
| 99 | + CatalogData catalogData = data.get(deviceId); | ||
| 100 | + if ( catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 超过五秒收不到消息任务超时, 只更新这一部分数据 | ||
| 101 | + if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.runIng)) { | ||
| 102 | + storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList()); | ||
| 103 | + if (catalogData.getTotal() != catalogData.getChannelList().size()) { | ||
| 104 | + String errorMsg = "更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条"; | ||
| 105 | + catalogData.setErrorMsg(errorMsg); | ||
| 106 | + } | ||
| 107 | + }else if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.ready)) { | ||
| 108 | + String errorMsg = "同步失败,等待回复超时"; | ||
| 109 | + catalogData.setErrorMsg(errorMsg); | ||
| 110 | + } | ||
| 100 | catalogData.setStatus(CatalogData.CatalogDataStatus.end); | 111 | catalogData.setStatus(CatalogData.CatalogDataStatus.end); |
| 101 | - catalogData.setErrorMsg(errorMsg); | ||
| 102 | } | 112 | } |
| 103 | - if (catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除 | ||
| 104 | - data.remove(key); | 113 | + if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end) && catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除 |
| 114 | + data.remove(deviceId); | ||
| 105 | } | 115 | } |
| 106 | } | 116 | } |
| 107 | } | 117 | } |
| 108 | 118 | ||
| 109 | 119 | ||
| 110 | - public void setChannelSyncEnd(String key, String errorMsg) { | ||
| 111 | - CatalogData catalogData = data.get(key); | 120 | + public void setChannelSyncEnd(String deviceId, String errorMsg) { |
| 121 | + CatalogData catalogData = data.get(deviceId); | ||
| 112 | if (catalogData == null)return; | 122 | if (catalogData == null)return; |
| 113 | catalogData.setStatus(CatalogData.CatalogDataStatus.end); | 123 | catalogData.setStatus(CatalogData.CatalogDataStatus.end); |
| 114 | catalogData.setErrorMsg(errorMsg); | 124 | catalogData.setErrorMsg(errorMsg); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
| @@ -250,7 +250,7 @@ public interface ISIPCommander { | @@ -250,7 +250,7 @@ public interface ISIPCommander { | ||
| 250 | * | 250 | * |
| 251 | * @param device 视频设备 | 251 | * @param device 视频设备 |
| 252 | */ | 252 | */ |
| 253 | - boolean catalogQuery(Device device, SipSubscribe.Event errorEvent); | 253 | + boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent); |
| 254 | 254 | ||
| 255 | /** | 255 | /** |
| 256 | * 查询录像信息 | 256 | * 查询录像信息 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -1208,14 +1208,14 @@ public class SIPCommander implements ISIPCommander { | @@ -1208,14 +1208,14 @@ public class SIPCommander implements ISIPCommander { | ||
| 1208 | * @param device 视频设备 | 1208 | * @param device 视频设备 |
| 1209 | */ | 1209 | */ |
| 1210 | @Override | 1210 | @Override |
| 1211 | - public boolean catalogQuery(Device device, SipSubscribe.Event errorEvent) { | 1211 | + public boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) { |
| 1212 | try { | 1212 | try { |
| 1213 | StringBuffer catalogXml = new StringBuffer(200); | 1213 | StringBuffer catalogXml = new StringBuffer(200); |
| 1214 | String charset = device.getCharset(); | 1214 | String charset = device.getCharset(); |
| 1215 | catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); | 1215 | catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); |
| 1216 | catalogXml.append("<Query>\r\n"); | 1216 | catalogXml.append("<Query>\r\n"); |
| 1217 | catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); | 1217 | catalogXml.append("<CmdType>Catalog</CmdType>\r\n"); |
| 1218 | - catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); | 1218 | + catalogXml.append("<SN>" + sn + "</SN>\r\n"); |
| 1219 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); | 1219 | catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); |
| 1220 | catalogXml.append("</Query>\r\n"); | 1220 | catalogXml.append("</Query>\r\n"); |
| 1221 | 1221 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
| @@ -86,23 +86,17 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | @@ -86,23 +86,17 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | ||
| 86 | rootElement = getRootElement(evt, device.getCharset()); | 86 | rootElement = getRootElement(evt, device.getCharset()); |
| 87 | Element deviceListElement = rootElement.element("DeviceList"); | 87 | Element deviceListElement = rootElement.element("DeviceList"); |
| 88 | Element sumNumElement = rootElement.element("SumNum"); | 88 | Element sumNumElement = rootElement.element("SumNum"); |
| 89 | - if (sumNumElement == null || deviceListElement == null) { | 89 | + Element snElement = rootElement.element("SN"); |
| 90 | + if (snElement == null || sumNumElement == null || deviceListElement == null) { | ||
| 90 | responseAck(evt, Response.BAD_REQUEST, "xml error"); | 91 | responseAck(evt, Response.BAD_REQUEST, "xml error"); |
| 91 | return; | 92 | return; |
| 92 | } | 93 | } |
| 93 | int sumNum = Integer.parseInt(sumNumElement.getText()); | 94 | int sumNum = Integer.parseInt(sumNumElement.getText()); |
| 95 | + | ||
| 94 | if (sumNum == 0) { | 96 | if (sumNum == 0) { |
| 95 | // 数据已经完整接收 | 97 | // 数据已经完整接收 |
| 96 | storager.cleanChannelsForDevice(device.getDeviceId()); | 98 | storager.cleanChannelsForDevice(device.getDeviceId()); |
| 97 | - RequestMessage msg = new RequestMessage(); | ||
| 98 | - msg.setKey(key); | ||
| 99 | - WVPResult<Object> result = new WVPResult<>(); | ||
| 100 | - result.setCode(0); | ||
| 101 | - result.setData(device); | ||
| 102 | - msg.setData(result); | ||
| 103 | - result.setMsg("更新成功,共0条"); | ||
| 104 | - deferredResultHolder.invokeAllResult(msg); | ||
| 105 | - catalogDataCatch.del(key); | 99 | + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null); |
| 106 | }else { | 100 | }else { |
| 107 | Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); | 101 | Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); |
| 108 | if (deviceListIterator != null) { | 102 | if (deviceListIterator != null) { |
| @@ -123,24 +117,18 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | @@ -123,24 +117,18 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | ||
| 123 | 117 | ||
| 124 | channelList.add(deviceChannel); | 118 | channelList.add(deviceChannel); |
| 125 | } | 119 | } |
| 120 | + int sn = Integer.parseInt(snElement.getText()); | ||
| 126 | logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum); | 121 | logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(key) == null ? 0 :catalogDataCatch.get(key).size(), sumNum); |
| 127 | - catalogDataCatch.put(key, sumNum, device, channelList); | ||
| 128 | - if (catalogDataCatch.get(key).size() == sumNum) { | 122 | + catalogDataCatch.put(device.getDeviceId(), sn, sumNum, device, channelList); |
| 123 | + if (catalogDataCatch.get(device.getDeviceId()).size() == sumNum) { | ||
| 129 | // 数据已经完整接收 | 124 | // 数据已经完整接收 |
| 130 | - boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(key)); | ||
| 131 | - RequestMessage msg = new RequestMessage(); | ||
| 132 | - msg.setKey(key); | ||
| 133 | - WVPResult<Object> result = new WVPResult<>(); | ||
| 134 | - result.setCode(0); | ||
| 135 | - result.setData(device); | ||
| 136 | - if (resetChannelsResult || sumNum ==0) { | ||
| 137 | - result.setMsg("更新成功,共" + sumNum + "条,已更新" + catalogDataCatch.get(key).size() + "条"); | 125 | + boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(device.getDeviceId())); |
| 126 | + if (!resetChannelsResult) { | ||
| 127 | + String errorMsg = "接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(device.getDeviceId()).size() + "条"; | ||
| 128 | + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), errorMsg); | ||
| 138 | }else { | 129 | }else { |
| 139 | - result.setMsg("接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(key).size() + "条"); | 130 | + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null); |
| 140 | } | 131 | } |
| 141 | - msg.setData(result); | ||
| 142 | - deferredResultHolder.invokeAllResult(msg); | ||
| 143 | - catalogDataCatch.del(key); | ||
| 144 | } | 132 | } |
| 145 | } | 133 | } |
| 146 | // 回复200 OK | 134 | // 回复200 OK |
| @@ -228,21 +216,18 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | @@ -228,21 +216,18 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | ||
| 228 | } | 216 | } |
| 229 | 217 | ||
| 230 | public SyncStatus getChannelSyncProgress(String deviceId) { | 218 | public SyncStatus getChannelSyncProgress(String deviceId) { |
| 231 | - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; | ||
| 232 | - if (catalogDataCatch.get(key) == null) { | 219 | + if (catalogDataCatch.get(deviceId) == null) { |
| 233 | return null; | 220 | return null; |
| 234 | }else { | 221 | }else { |
| 235 | - return catalogDataCatch.getSyncStatus(key); | 222 | + return catalogDataCatch.getSyncStatus(deviceId); |
| 236 | } | 223 | } |
| 237 | } | 224 | } |
| 238 | 225 | ||
| 239 | - public void setChannelSyncReady(String deviceId) { | ||
| 240 | - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; | ||
| 241 | - catalogDataCatch.addReady(key); | 226 | + public void setChannelSyncReady(Device device, int sn) { |
| 227 | + catalogDataCatch.addReady(device, sn); | ||
| 242 | } | 228 | } |
| 243 | 229 | ||
| 244 | public void setChannelSyncEnd(String deviceId, String errorMsg) { | 230 | public void setChannelSyncEnd(String deviceId, String errorMsg) { |
| 245 | - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; | ||
| 246 | - catalogDataCatch.setChannelSyncEnd(key, errorMsg); | 231 | + catalogDataCatch.setChannelSyncEnd(deviceId, errorMsg); |
| 247 | } | 232 | } |
| 248 | } | 233 | } |
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
| @@ -44,15 +44,8 @@ public interface IDeviceService { | @@ -44,15 +44,8 @@ public interface IDeviceService { | ||
| 44 | SyncStatus getChannelSyncStatus(String deviceId); | 44 | SyncStatus getChannelSyncStatus(String deviceId); |
| 45 | 45 | ||
| 46 | /** | 46 | /** |
| 47 | - * 设置通道同步状态 | ||
| 48 | - * @param deviceId 设备ID | ||
| 49 | - */ | ||
| 50 | - void setChannelSyncReady(String deviceId); | ||
| 51 | - | ||
| 52 | - /** | ||
| 53 | - * 设置同步结束 | ||
| 54 | - * @param deviceId 设备ID | ||
| 55 | - * @param errorMsg 错误信息 | 47 | + * 通道同步 |
| 48 | + * @param device | ||
| 56 | */ | 49 | */ |
| 57 | - void setChannelSyncEnd(String deviceId, String errorMsg); | 50 | + void sync(Device device); |
| 58 | } | 51 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
| @@ -100,12 +100,16 @@ public class DeviceServiceImpl implements IDeviceService { | @@ -100,12 +100,16 @@ public class DeviceServiceImpl implements IDeviceService { | ||
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | @Override | 102 | @Override |
| 103 | - public void setChannelSyncReady(String deviceId) { | ||
| 104 | - catalogResponseMessageHandler.setChannelSyncReady(deviceId); | ||
| 105 | - } | ||
| 106 | - | ||
| 107 | - @Override | ||
| 108 | - public void setChannelSyncEnd(String deviceId, String errorMsg) { | ||
| 109 | - catalogResponseMessageHandler.setChannelSyncEnd(deviceId, errorMsg); | 103 | + public void sync(Device device) { |
| 104 | + if (catalogResponseMessageHandler.getChannelSyncProgress(device.getDeviceId()) != null) { | ||
| 105 | + logger.info("开启同步时发现同步已经存在"); | ||
| 106 | + return; | ||
| 107 | + } | ||
| 108 | + int sn = (int)((Math.random()*9+1)*100000); | ||
| 109 | + catalogResponseMessageHandler.setChannelSyncReady(device, sn); | ||
| 110 | + sipCommander.catalogQuery(device, sn, event -> { | ||
| 111 | + String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg); | ||
| 112 | + catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); | ||
| 113 | + }); | ||
| 110 | } | 114 | } |
| 111 | } | 115 | } |
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
| @@ -238,12 +238,15 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -238,12 +238,15 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 238 | 238 | ||
| 239 | @Override | 239 | @Override |
| 240 | public boolean resetChannels(String deviceId, List<DeviceChannel> deviceChannelList) { | 240 | public boolean resetChannels(String deviceId, List<DeviceChannel> deviceChannelList) { |
| 241 | + if (deviceChannelList == null) { | ||
| 242 | + return false; | ||
| 243 | + } | ||
| 241 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 244 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); |
| 242 | // 数据去重 | 245 | // 数据去重 |
| 243 | List<DeviceChannel> channels = new ArrayList<>(); | 246 | List<DeviceChannel> channels = new ArrayList<>(); |
| 244 | StringBuilder stringBuilder = new StringBuilder(); | 247 | StringBuilder stringBuilder = new StringBuilder(); |
| 245 | Map<String, Integer> subContMap = new HashMap<>(); | 248 | Map<String, Integer> subContMap = new HashMap<>(); |
| 246 | - if (deviceChannelList.size() > 1) { | 249 | + if (deviceChannelList != null && deviceChannelList.size() > 1) { |
| 247 | // 数据去重 | 250 | // 数据去重 |
| 248 | Set<String> gbIdSet = new HashSet<>(); | 251 | Set<String> gbIdSet = new HashSet<>(); |
| 249 | for (DeviceChannel deviceChannel : deviceChannelList) { | 252 | for (DeviceChannel deviceChannel : deviceChannelList) { |
| @@ -300,6 +303,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -300,6 +303,7 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 300 | dataSourceTransactionManager.commit(transactionStatus); //手动提交 | 303 | dataSourceTransactionManager.commit(transactionStatus); //手动提交 |
| 301 | return true; | 304 | return true; |
| 302 | }catch (Exception e) { | 305 | }catch (Exception e) { |
| 306 | + e.printStackTrace(); | ||
| 303 | dataSourceTransactionManager.rollback(transactionStatus); | 307 | dataSourceTransactionManager.rollback(transactionStatus); |
| 304 | return false; | 308 | return false; |
| 305 | } | 309 | } |
| @@ -415,10 +419,9 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -415,10 +419,9 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 415 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 419 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); |
| 416 | boolean result = false; | 420 | boolean result = false; |
| 417 | try { | 421 | try { |
| 418 | - if (platformChannelMapper.delChannelForDeviceId(deviceId) <0 // 删除与国标平台的关联 | ||
| 419 | - || deviceChannelMapper.cleanChannelsByDeviceId(deviceId) < 0 // 删除他的通道 | ||
| 420 | - || deviceMapper.del(deviceId) < 0 // 移除设备信息 | ||
| 421 | - ) { | 422 | + platformChannelMapper.delChannelForDeviceId(deviceId); |
| 423 | + deviceChannelMapper.cleanChannelsByDeviceId(deviceId); | ||
| 424 | + if ( deviceMapper.del(deviceId) < 0 ) { | ||
| 422 | //事务回滚 | 425 | //事务回滚 |
| 423 | dataSourceTransactionManager.rollback(transactionStatus); | 426 | dataSourceTransactionManager.rollback(transactionStatus); |
| 424 | } | 427 | } |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
| @@ -172,12 +172,8 @@ public class DeviceQuery { | @@ -172,12 +172,8 @@ public class DeviceQuery { | ||
| 172 | wvpResult.setData(syncStatus); | 172 | wvpResult.setData(syncStatus); |
| 173 | return wvpResult; | 173 | return wvpResult; |
| 174 | } | 174 | } |
| 175 | - SyncStatus syncStatusReady = new SyncStatus(); | ||
| 176 | - deviceService.setChannelSyncReady(deviceId); | ||
| 177 | - cmder.catalogQuery(device, event -> { | ||
| 178 | - String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg); | ||
| 179 | - deviceService.setChannelSyncEnd(deviceId, errorMsg); | ||
| 180 | - }); | 175 | + deviceService.sync(device); |
| 176 | + | ||
| 181 | WVPResult<SyncStatus> wvpResult = new WVPResult<>(); | 177 | WVPResult<SyncStatus> wvpResult = new WVPResult<>(); |
| 182 | wvpResult.setCode(0); | 178 | wvpResult.setCode(0); |
| 183 | wvpResult.setMsg("开始同步"); | 179 | wvpResult.setMsg("开始同步"); |
web_src/src/components/dialog/SyncChannelProgress.vue
| @@ -61,23 +61,36 @@ export default { | @@ -61,23 +61,36 @@ export default { | ||
| 61 | if (!this.syncFlag) { | 61 | if (!this.syncFlag) { |
| 62 | this.syncFlag = true; | 62 | this.syncFlag = true; |
| 63 | } | 63 | } |
| 64 | - if (res.data.data == null) { | ||
| 65 | - this.syncStatus = "success" | ||
| 66 | - this.percentage = 100; | ||
| 67 | - this.msg = '同步成功'; | ||
| 68 | - }else if (res.data.data.total == 0){ | ||
| 69 | - this.msg = `等待同步中`; | ||
| 70 | - this.timmer = setTimeout(this.getProgress, 300) | ||
| 71 | - }else if (res.data.data.errorMsg !== null ){ | ||
| 72 | - this.msg = res.data.data.errorMsg; | ||
| 73 | - this.syncStatus = "exception" | ||
| 74 | - }else { | ||
| 75 | - this.total = res.data.data.total; | ||
| 76 | - this.current = res.data.data.current; | ||
| 77 | - this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100; | ||
| 78 | - this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`; | ||
| 79 | - this.timmer = setTimeout(this.getProgress, 300) | 64 | + |
| 65 | + if (res.data.data != null) { | ||
| 66 | + if (res.data.data.total == 0) { | ||
| 67 | + if (res.data.data.errorMsg !== null ){ | ||
| 68 | + this.msg = res.data.data.errorMsg; | ||
| 69 | + this.syncStatus = "exception" | ||
| 70 | + }else { | ||
| 71 | + this.msg = `等待同步中`; | ||
| 72 | + this.timmer = setTimeout(this.getProgress, 300) | ||
| 73 | + } | ||
| 74 | + }else { | ||
| 75 | + if (res.data.data.total == res.data.data.current) { | ||
| 76 | + this.syncStatus = "success" | ||
| 77 | + this.percentage = 100; | ||
| 78 | + this.msg = '同步成功'; | ||
| 79 | + }else { | ||
| 80 | + if (res.data.data.errorMsg !== null ){ | ||
| 81 | + this.msg = res.data.data.errorMsg; | ||
| 82 | + this.syncStatus = "exception" | ||
| 83 | + }else { | ||
| 84 | + this.total = res.data.data.total; | ||
| 85 | + this.current = res.data.data.current; | ||
| 86 | + this.percentage = Math.floor(Number(res.data.data.current)/Number(res.data.data.total)* 10000)/100; | ||
| 87 | + this.msg = `同步中...[${res.data.data.current}/${res.data.data.total}]`; | ||
| 88 | + this.timmer = setTimeout(this.getProgress, 300) | ||
| 89 | + } | ||
| 90 | + } | ||
| 91 | + } | ||
| 80 | } | 92 | } |
| 93 | + | ||
| 81 | }else { | 94 | }else { |
| 82 | if (this.syncFlag) { | 95 | if (this.syncFlag) { |
| 83 | this.syncStatus = "success" | 96 | this.syncStatus = "success" |