特定时间范围的历史视频查询请求 预拉取视频响应
改为异步等待完成再返回 如果1分钟内未能完成再 返回 空录像
This commit is contained in:
parent
b42b8be747
commit
4b55f7fc54
@ -4,9 +4,11 @@ import cn.hutool.core.collection.ListUtil;
|
|||||||
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DatePattern;
|
||||||
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUnit;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.skcks.docking.gb28181.common.json.JsonResponse;
|
||||||
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
|
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.query.dto.RecordInfoRequestDTO;
|
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.query.dto.RecordInfoRequestDTO;
|
||||||
import cn.skcks.docking.gb28181.mocking.config.sip.DeviceProxyConfig;
|
import cn.skcks.docking.gb28181.mocking.config.sip.DeviceProxyConfig;
|
||||||
|
import cn.skcks.docking.gb28181.mocking.core.sip.executor.MockingExecutor;
|
||||||
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordInfoItemDTO;
|
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordInfoItemDTO;
|
||||||
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordInfoResponseDTO;
|
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordInfoResponseDTO;
|
||||||
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordListDTO;
|
import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.recordinfo.dto.RecordListDTO;
|
||||||
@ -20,6 +22,7 @@ import gov.nist.javax.sip.message.SIPRequest;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.sip.header.CallIdHeader;
|
import javax.sip.header.CallIdHeader;
|
||||||
@ -29,6 +32,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -38,24 +45,27 @@ public class RecordInfoRequestProcessor {
|
|||||||
private final DeviceService deviceService;
|
private final DeviceService deviceService;
|
||||||
private final DeviceProxyConfig deviceProxyConfig;
|
private final DeviceProxyConfig deviceProxyConfig;
|
||||||
private final VideoCacheManager videoCacheManager;
|
private final VideoCacheManager videoCacheManager;
|
||||||
|
@Qualifier(MockingExecutor.EXECUTOR_BEAN_NAME)
|
||||||
|
private final Executor executor;
|
||||||
|
|
||||||
public void process(SIPRequest request, byte[] content) {
|
public void process(SIPRequest request, byte[] content) {
|
||||||
String senderIp = request.getLocalAddress().getHostAddress();
|
String senderIp = request.getLocalAddress().getHostAddress();
|
||||||
String transport = request.getTopmostViaHeader().getTransport();
|
String transport = request.getTopmostViaHeader().getTransport();
|
||||||
RecordInfoRequestDTO recordInfoRequestDTO = XmlUtils.parse(content, RecordInfoRequestDTO.class);
|
RecordInfoRequestDTO recordInfoRequestDTO = XmlUtils.parse(content, RecordInfoRequestDTO.class);
|
||||||
String id = recordInfoRequestDTO.getDeviceId();
|
String id = recordInfoRequestDTO.getDeviceId();
|
||||||
|
|
||||||
deviceService.getDeviceByGbChannelId(id).ifPresentOrElse((device) -> {
|
deviceService.getDeviceByGbChannelId(id).ifPresentOrElse((device) -> {
|
||||||
if(preDownloadVideo(device.getDeviceCode(), recordInfoRequestDTO)){
|
if(preDownloadVideo(device.getDeviceCode(), recordInfoRequestDTO)){
|
||||||
sendRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
sendRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
||||||
} else {
|
} else {
|
||||||
sendEmptyRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
processRecordInfoRespWithVideoCacheTask(request, senderIp, transport, device, recordInfoRequestDTO);
|
||||||
}
|
}
|
||||||
}, () -> {
|
}, () -> {
|
||||||
deviceService.getDeviceByGbChannelId(id).ifPresentOrElse((device) -> {
|
deviceService.getDeviceByGbChannelId(id).ifPresentOrElse((device) -> {
|
||||||
if(preDownloadVideo(device.getDeviceCode(), recordInfoRequestDTO)){
|
if(preDownloadVideo(device.getDeviceCode(), recordInfoRequestDTO)){
|
||||||
sendRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
sendRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
||||||
} else {
|
} else {
|
||||||
sendEmptyRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
processRecordInfoRespWithVideoCacheTask(request, senderIp, transport, device, recordInfoRequestDTO);
|
||||||
}
|
}
|
||||||
}, () -> {
|
}, () -> {
|
||||||
log.error("未能找到 deviceId: {} 的相关信息", id);
|
log.error("未能找到 deviceId: {} 的相关信息", id);
|
||||||
@ -64,6 +74,24 @@ public class RecordInfoRequestProcessor {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void processRecordInfoRespWithVideoCacheTask(SIPRequest request, String senderIp, String transport, MockingDevice device, RecordInfoRequestDTO recordInfoRequestDTO){
|
||||||
|
CompletableFuture<Runnable> future = CompletableFuture.supplyAsync(()-> {
|
||||||
|
try {
|
||||||
|
preDownloadVideoTask(device.getDeviceCode(), recordInfoRequestDTO).get();
|
||||||
|
return ()-> sendRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
||||||
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
|
log.error("preDownloadVideoTask error",e);
|
||||||
|
return() -> sendEmptyRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport);
|
||||||
|
}
|
||||||
|
}, executor);
|
||||||
|
future.completeOnTimeout(() -> sendEmptyRecordInfo(device, recordInfoRequestDTO, request, senderIp, transport),
|
||||||
|
1, TimeUnit.MINUTES);
|
||||||
|
future.thenApplyAsync(fn->{
|
||||||
|
fn.run();
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private boolean preDownloadVideo(String deviceCode, RecordInfoRequestDTO recordInfoRequestDTO){
|
private boolean preDownloadVideo(String deviceCode, RecordInfoRequestDTO recordInfoRequestDTO){
|
||||||
if(!deviceProxyConfig.getPreDownloadForRecordInfo().getEnable()){
|
if(!deviceProxyConfig.getPreDownloadForRecordInfo().getEnable()){
|
||||||
return true;
|
return true;
|
||||||
@ -75,10 +103,16 @@ public class RecordInfoRequestProcessor {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return preDownloadVideoTask(deviceCode,recordInfoRequestDTO).isDone();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompletableFuture<JsonResponse<String>> preDownloadVideoTask(String deviceCode, RecordInfoRequestDTO recordInfoRequestDTO){
|
||||||
|
Date startTime = recordInfoRequestDTO.getStartTime();
|
||||||
|
Date endTime = recordInfoRequestDTO.getEndTime();
|
||||||
|
|
||||||
// 添加预下载任务
|
// 添加预下载任务
|
||||||
videoCacheManager.addTask(deviceCode,startTime,endTime);
|
videoCacheManager.addTask(deviceCode,startTime,endTime);
|
||||||
|
return videoCacheManager.get(deviceCode,startTime,endTime);
|
||||||
return videoCacheManager.get(deviceCode,startTime,endTime).isDone();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendRecordInfo(MockingDevice device, RecordInfoRequestDTO recordInfoRequestDTO, SIPRequest request, String senderIp, String transport) {
|
private void sendRecordInfo(MockingDevice device, RecordInfoRequestDTO recordInfoRequestDTO, SIPRequest request, String senderIp, String transport) {
|
||||||
|
Loading…
Reference in New Issue
Block a user