Commit dc1d9646a97ac07d20a911c0daf5bae361964717
1 parent
df321f27
优化录像列表获取算法
Showing
2 changed files
with
16 additions
and
26 deletions
.gitignore
| @@ -9,7 +9,7 @@ | @@ -9,7 +9,7 @@ | ||
| 9 | 9 | ||
| 10 | # Mobile Tools for Java (J2ME) | 10 | # Mobile Tools for Java (J2ME) |
| 11 | .mtj.tmp/ | 11 | .mtj.tmp/ |
| 12 | - | 12 | +src/main/resources/application-*.yml |
| 13 | # Package Files # | 13 | # Package Files # |
| 14 | #*.jar | 14 | #*.jar |
| 15 | *.war | 15 | *.war |
| @@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
| 18 | *.zip | 18 | *.zip |
| 19 | *.tar.gz | 19 | *.tar.gz |
| 20 | *.rar | 20 | *.rar |
| 21 | - | 21 | +*.iml |
| 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml |
| 23 | hs_err_pid* | 23 | hs_err_pid* |
| 24 | /.idea/* | 24 | /.idea/* |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
| @@ -342,6 +342,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | @@ -342,6 +342,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | ||
| 342 | try { | 342 | try { |
| 343 | // 回复200 OK | 343 | // 回复200 OK |
| 344 | responseAck(evt); | 344 | responseAck(evt); |
| 345 | + String seqNo = String.valueOf(System.currentTimeMillis()); | ||
| 345 | RecordInfo recordInfo = new RecordInfo(); | 346 | RecordInfo recordInfo = new RecordInfo(); |
| 346 | Element rootElement = getRootElement(evt); | 347 | Element rootElement = getRootElement(evt); |
| 347 | Element deviceIdElement = rootElement.element("DeviceID"); | 348 | Element deviceIdElement = rootElement.element("DeviceID"); |
| @@ -396,32 +397,22 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | @@ -396,32 +397,22 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | ||
| 396 | if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) { | 397 | if (recordInfo.getSumNum() > 0 && recordList.size() > 0 && recordList.size() < recordInfo.getSumNum()) { |
| 397 | // 为防止连续请求该设备的录像数据,返回数据错乱,特增加sn进行区分 | 398 | // 为防止连续请求该设备的录像数据,返回数据错乱,特增加sn进行区分 |
| 398 | String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn; | 399 | String cacheKey = CACHE_RECORDINFO_KEY + deviceId + sn; |
| 399 | - // TODO 暂时直接操作redis存储,后续封装专用缓存接口,改为本地内存缓存 | ||
| 400 | - if (redis.hasKey(cacheKey)) { | ||
| 401 | - List<RecordItem> previousList = (List<RecordItem>) redis.get(cacheKey); | ||
| 402 | - if (previousList != null && previousList.size() > 0) { | ||
| 403 | - recordList.addAll(previousList); | ||
| 404 | - } | ||
| 405 | - // 本分支表示录像列表被拆包,且加上之前的数据还是不够,保存缓存返回,等待下个包再处理 | ||
| 406 | - if (recordList.size() < recordInfo.getSumNum()) { | ||
| 407 | - logger.info("已获取" + recordList.size() + "项录像数据,共" + recordInfo.getSumNum() + "项"); | ||
| 408 | - redis.set(cacheKey, recordList, 90); | ||
| 409 | - return; | ||
| 410 | - } else { | ||
| 411 | - // 本分支表示录像被拆包,但加上之前的数据够足够,返回响应 | ||
| 412 | - // 因设备心跳有监听redis过期机制,为提高性能,此处手动删除 | ||
| 413 | - logger.info("录像数据已全部获取"); | ||
| 414 | - redis.del(cacheKey); | ||
| 415 | - } | ||
| 416 | - } else { | ||
| 417 | - // 本分支有两种可能:1、录像列表被拆包,且是第一个包,直接保存缓存返回,等待下个包再处理 | ||
| 418 | - // 2、之前有包,但超时清空了,那么这次sn批次的响应数据已经不完整,等待过期时间后redis自动清空数据 | ||
| 419 | - logger.info("已获取" + recordList.size() + "项录像数据,共" + recordInfo.getSumNum() + "项"); | ||
| 420 | - logger.info("等待后续的包..."); | ||
| 421 | 400 | ||
| 422 | - redis.set(cacheKey, recordList, 90); | 401 | + redis.set(cacheKey + "_" + seqNo, recordList, 90); |
| 402 | + List<Object> cacheKeys = redis.scan(cacheKey + "_*"); | ||
| 403 | + List<RecordItem> totalRecordList = new ArrayList<RecordItem>(); | ||
| 404 | + for (int i = 0; i < cacheKeys.size(); i++) { | ||
| 405 | + totalRecordList.addAll((List<RecordItem>) redis.get(cacheKeys.get(i).toString())); | ||
| 406 | + } | ||
| 407 | + if (totalRecordList.size() < recordInfo.getSumNum()) { | ||
| 408 | + logger.info("已获取" + totalRecordList.size() + "项录像数据,共" + recordInfo.getSumNum() + "项"); | ||
| 423 | return; | 409 | return; |
| 424 | } | 410 | } |
| 411 | + logger.info("录像数据已全部获取,共" + recordInfo.getSumNum() + "项"); | ||
| 412 | + recordInfo.setRecordList(totalRecordList); | ||
| 413 | + for (int i = 0; i < cacheKeys.size(); i++) { | ||
| 414 | + redis.del(cacheKeys.get(i).toString()); | ||
| 415 | + } | ||
| 425 | } | 416 | } |
| 426 | // 自然顺序排序, 元素进行升序排列 | 417 | // 自然顺序排序, 元素进行升序排列 |
| 427 | recordInfo.getRecordList().sort(Comparator.naturalOrder()); | 418 | recordInfo.getRecordList().sort(Comparator.naturalOrder()); |
| @@ -460,7 +451,6 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | @@ -460,7 +451,6 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { | ||
| 460 | cmder.streamByeCmd(streamInfo.getStreamId()); | 451 | cmder.streamByeCmd(streamInfo.getStreamId()); |
| 461 | } | 452 | } |
| 462 | } | 453 | } |
| 463 | - | ||
| 464 | } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { | 454 | } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { |
| 465 | e.printStackTrace(); | 455 | e.printStackTrace(); |
| 466 | } | 456 | } |