Commit a556d8520b50ea5db579e0506f8906de8fb26304
1 parent
81f9119d
修正针对部分设备无录像时不返回RecordInfo段而长时间等待的bug
Showing
1 changed file
with
62 additions
and
59 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
| ... | ... | @@ -310,73 +310,76 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 310 | 310 | recordInfo.setSumNum(Integer.parseInt(XmlUtil.getText(rootElement, "SumNum"))); |
| 311 | 311 | String sn = XmlUtil.getText(rootElement, "SN"); |
| 312 | 312 | Element recordListElement = rootElement.element("RecordList"); |
| 313 | - if (recordListElement == null) { | |
| 313 | + if (recordListElement == null || recordInfo.getSumNum() == 0) { | |
| 314 | 314 | logger.info("无录像数据"); |
| 315 | 315 | // responseAck(evt); |
| 316 | - return; | |
| 317 | - } | |
| 318 | - | |
| 319 | - Iterator<Element> recordListIterator = recordListElement.elementIterator(); | |
| 320 | - List<RecordItem> recordList = new ArrayList<RecordItem>(); | |
| 321 | - if (recordListIterator != null) { | |
| 322 | - RecordItem record = new RecordItem(); | |
| 323 | - logger.info("处理录像列表数据..."); | |
| 324 | - // 遍历DeviceList | |
| 325 | - while (recordListIterator.hasNext()) { | |
| 326 | - Element itemRecord = recordListIterator.next(); | |
| 327 | - Element recordElement = itemRecord.element("DeviceID"); | |
| 328 | - if (recordElement == null) { | |
| 329 | - logger.info("记录为空,下一个..."); | |
| 330 | - continue; | |
| 316 | + // return; | |
| 317 | + } else { | |
| 318 | + Iterator<Element> recordListIterator = recordListElement.elementIterator(); | |
| 319 | + List<RecordItem> recordList = new ArrayList<RecordItem>(); | |
| 320 | + if (recordListIterator != null) { | |
| 321 | + RecordItem record = new RecordItem(); | |
| 322 | + logger.info("处理录像列表数据..."); | |
| 323 | + // 遍历DeviceList | |
| 324 | + while (recordListIterator.hasNext()) { | |
| 325 | + Element itemRecord = recordListIterator.next(); | |
| 326 | + Element recordElement = itemRecord.element("DeviceID"); | |
| 327 | + if (recordElement == null) { | |
| 328 | + logger.info("记录为空,下一个..."); | |
| 329 | + continue; | |
| 330 | + } | |
| 331 | + record = new RecordItem(); | |
| 332 | + record.setDeviceId(XmlUtil.getText(itemRecord, "DeviceID")); | |
| 333 | + record.setName(XmlUtil.getText(itemRecord, "Name")); | |
| 334 | + record.setFilePath(XmlUtil.getText(itemRecord, "FilePath")); | |
| 335 | + record.setAddress(XmlUtil.getText(itemRecord, "Address")); | |
| 336 | + record.setStartTime( | |
| 337 | + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "StartTime"))); | |
| 338 | + record.setEndTime( | |
| 339 | + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "EndTime"))); | |
| 340 | + record.setSecrecy(itemRecord.element("Secrecy") == null ? 0 | |
| 341 | + : Integer.parseInt(XmlUtil.getText(itemRecord, "Secrecy"))); | |
| 342 | + record.setType(XmlUtil.getText(itemRecord, "Type")); | |
| 343 | + record.setRecorderId(XmlUtil.getText(itemRecord, "RecorderID")); | |
| 344 | + recordList.add(record); | |
| 331 | 345 | } |
| 332 | - record = new RecordItem(); | |
| 333 | - record.setDeviceId(XmlUtil.getText(itemRecord, "DeviceID")); | |
| 334 | - record.setName(XmlUtil.getText(itemRecord, "Name")); | |
| 335 | - record.setFilePath(XmlUtil.getText(itemRecord, "FilePath")); | |
| 336 | - record.setAddress(XmlUtil.getText(itemRecord, "Address")); | |
| 337 | - record.setStartTime( | |
| 338 | - DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "StartTime"))); | |
| 339 | - record.setEndTime(DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(XmlUtil.getText(itemRecord, "EndTime"))); | |
| 340 | - record.setSecrecy(itemRecord.element("Secrecy") == null ? 0 | |
| 341 | - : Integer.parseInt(XmlUtil.getText(itemRecord, "Secrecy"))); | |
| 342 | - record.setType(XmlUtil.getText(itemRecord, "Type")); | |
| 343 | - record.setRecorderId(XmlUtil.getText(itemRecord, "RecorderID")); | |
| 344 | - recordList.add(record); | |
| 346 | + // recordList.sort(Comparator.naturalOrder()); | |
| 347 | + recordInfo.setRecordList(recordList); | |
| 345 | 348 | } |
| 346 | - // recordList.sort(Comparator.naturalOrder()); | |
| 347 | - recordInfo.setRecordList(recordList); | |
| 348 | - } | |
| 349 | 349 | |
| 350 | - // 存在录像且如果当前录像明细个数小于总条数,说明拆包返回,需要组装,暂不返回 | |
| 351 | - if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) { | |
| 352 | - // 为防止连续请求该设备的录像数据,返回数据错乱,特增加sn进行区分 | |
| 353 | - String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn; | |
| 354 | - // TODO 暂时直接操作redis存储,后续封装专用缓存接口,改为本地内存缓存 | |
| 355 | - if (redis.hasKey(cacheKey)) { | |
| 356 | - List<RecordItem> previousList = (List<RecordItem>) redis.get(cacheKey); | |
| 357 | - if (previousList != null && previousList.size() > 0) { | |
| 358 | - recordList.addAll(previousList); | |
| 359 | - } | |
| 360 | - // 本分支表示录像列表被拆包,且加上之前的数据还是不够,保存缓存返回,等待下个包再处理 | |
| 361 | - if (recordList.size() < recordInfo.getSumNum()) { | |
| 350 | + // 存在录像且如果当前录像明细个数小于总条数,说明拆包返回,需要组装,暂不返回 | |
| 351 | + if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) { | |
| 352 | + // 为防止连续请求该设备的录像数据,返回数据错乱,特增加sn进行区分 | |
| 353 | + String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn; | |
| 354 | + // TODO 暂时直接操作redis存储,后续封装专用缓存接口,改为本地内存缓存 | |
| 355 | + if (redis.hasKey(cacheKey)) { | |
| 356 | + List<RecordItem> previousList = (List<RecordItem>) redis.get(cacheKey); | |
| 357 | + if (previousList != null && previousList.size() > 0) { | |
| 358 | + recordList.addAll(previousList); | |
| 359 | + } | |
| 360 | + // 本分支表示录像列表被拆包,且加上之前的数据还是不够,保存缓存返回,等待下个包再处理 | |
| 361 | + if (recordList.size() < recordInfo.getSumNum()) { | |
| 362 | + logger.info("已获取" + recordList.size() + "项录像数据,共" + recordInfo.getSumNum() + "项"); | |
| 363 | + redis.set(cacheKey, recordList, 90); | |
| 364 | + return; | |
| 365 | + } else { | |
| 366 | + // 本分支表示录像被拆包,但加上之前的数据够足够,返回响应 | |
| 367 | + // 因设备心跳有监听redis过期机制,为提高性能,此处手动删除 | |
| 368 | + logger.info("录像数据已全部获取"); | |
| 369 | + redis.del(cacheKey); | |
| 370 | + } | |
| 371 | + } else { | |
| 372 | + // 本分支有两种可能:1、录像列表被拆包,且是第一个包,直接保存缓存返回,等待下个包再处理 | |
| 373 | + // 2、之前有包,但超时清空了,那么这次sn批次的响应数据已经不完整,等待过期时间后redis自动清空数据 | |
| 362 | 374 | logger.info("已获取" + recordList.size() + "项录像数据,共" + recordInfo.getSumNum() + "项"); |
| 375 | + logger.info("等待后续的包..."); | |
| 376 | + | |
| 363 | 377 | redis.set(cacheKey, recordList, 90); |
| 364 | 378 | return; |
| 365 | - } else { | |
| 366 | - // 本分支表示录像被拆包,但加上之前的数据够足够,返回响应 | |
| 367 | - // 因设备心跳有监听redis过期机制,为提高性能,此处手动删除 | |
| 368 | - logger.info("录像数据已全部获取"); | |
| 369 | - redis.del(cacheKey); | |
| 370 | 379 | } |
| 371 | - } else { | |
| 372 | - // 本分支有两种可能:1、录像列表被拆包,且是第一个包,直接保存缓存返回,等待下个包再处理 | |
| 373 | - // 2、之前有包,但超时清空了,那么这次sn批次的响应数据已经不完整,等待过期时间后redis自动清空数据 | |
| 374 | - logger.info("等待后续的包..."); | |
| 375 | - | |
| 376 | - redis.set(cacheKey, recordList, 90); | |
| 377 | - return; | |
| 378 | 380 | } |
| 379 | - | |
| 381 | + // 自然顺序排序, 元素进行升序排列 | |
| 382 | + recordInfo.getRecordList().sort(Comparator.naturalOrder()); | |
| 380 | 383 | } |
| 381 | 384 | // 走到这里,有以下可能:1、没有录像信息,第一次收到recordinfo的消息即返回响应数据,无redis操作 |
| 382 | 385 | // 2、有录像数据,且第一次即收到完整数据,返回响应数据,无redis操作 |
| ... | ... | @@ -386,8 +389,8 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { |
| 386 | 389 | RequestMessage msg = new RequestMessage(); |
| 387 | 390 | msg.setDeviceId(deviceId); |
| 388 | 391 | msg.setType(DeferredResultHolder.CALLBACK_CMD_RECORDINFO); |
| 389 | - // 自然顺序排序, 元素进行升序排列 | |
| 390 | - recordInfo.getRecordList().sort(Comparator.naturalOrder()); | |
| 392 | + // // 自然顺序排序, 元素进行升序排列 | |
| 393 | + // recordInfo.getRecordList().sort(Comparator.naturalOrder()); | |
| 391 | 394 | msg.setData(recordInfo); |
| 392 | 395 | deferredResultHolder.invokeResult(msg); |
| 393 | 396 | logger.info("处理完成,返回结果"); | ... | ... |