针对某些不按规范的设备 的 历史媒体记录查询
This commit is contained in:
parent
6ea57afc10
commit
81e20fee9a
@ -4,10 +4,10 @@ import cn.skcks.docking.gb28181.common.json.ResponseStatus;
|
|||||||
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
|
import cn.skcks.docking.gb28181.common.xml.XmlUtils;
|
||||||
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
|
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
|
||||||
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.CmdType;
|
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.CmdType;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.request.dto.MessageDTO;
|
|
||||||
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.GB28181Constant;
|
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.GB28181Constant;
|
||||||
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
||||||
|
import cn.skcks.docking.gb28181.core.sip.message.processor.message.request.dto.MessageDTO;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.reponse.dto.RecordInfoResponseDTO;
|
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.reponse.dto.RecordInfoResponseDTO;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.sender.SipMessageSender;
|
import cn.skcks.docking.gb28181.core.sip.message.sender.SipMessageSender;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.subscribe.SipSubscribe;
|
import cn.skcks.docking.gb28181.core.sip.message.subscribe.SipSubscribe;
|
||||||
@ -25,7 +25,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import javax.sip.RequestEvent;
|
import javax.sip.RequestEvent;
|
||||||
import javax.sip.header.CallIdHeader;
|
import javax.sip.header.CallIdHeader;
|
||||||
import javax.sip.message.Response;
|
import javax.sip.message.Response;
|
||||||
import java.util.concurrent.SubmissionPublisher;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -72,8 +72,9 @@ public class MessageRequestProcessor implements MessageProcessor {
|
|||||||
response = ok;
|
response = ok;
|
||||||
RecordInfoResponseDTO dto = XmlUtils.parse(content, RecordInfoResponseDTO.class, GB28181Constant.CHARSET);
|
RecordInfoResponseDTO dto = XmlUtils.parse(content, RecordInfoResponseDTO.class, GB28181Constant.CHARSET);
|
||||||
String key = CacheUtil.getKey(CmdType.RECORD_INFO, dto.getDeviceId(), dto.getSn());
|
String key = CacheUtil.getKey(CmdType.RECORD_INFO, dto.getDeviceId(), dto.getSn());
|
||||||
SubmissionPublisher<RecordInfoResponseDTO> publisher = subscribe.getRecordInfoSubscribe().getPublisher(key);
|
Optional.ofNullable(subscribe.getRecordInfoSubscribe().getPublisher(key)).ifPresentOrElse(publisher->{
|
||||||
publisher.submit(dto);
|
publisher.submit(dto);
|
||||||
|
},()-> log.warn("对应订阅 {} 已结束, 异常数据 => {}",key, dto));
|
||||||
} else {
|
} else {
|
||||||
response = response(request, Response.NOT_IMPLEMENTED, ResponseStatus.NOT_IMPLEMENTED.getMessage());
|
response = response(request, Response.NOT_IMPLEMENTED, ResponseStatus.NOT_IMPLEMENTED.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ import javax.sip.header.CallIdHeader;
|
|||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Flow;
|
import java.util.concurrent.*;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -40,7 +40,8 @@ public class RecordService {
|
|||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public DeferredResult<JsonResponse<List<RecordInfoItemDTO>>> requestRecordInfo(String deviceId) {
|
public DeferredResult<JsonResponse<List<RecordInfoItemDTO>>> requestRecordInfo(String deviceId) {
|
||||||
DeferredResult<JsonResponse<List<RecordInfoItemDTO>>> result = new DeferredResult<>(30 * 1000L);
|
log.info("TimeUnit.SECONDS.toMillis(30) {}",TimeUnit.SECONDS.toMillis(30));
|
||||||
|
DeferredResult<JsonResponse<List<RecordInfoItemDTO>>> result = new DeferredResult<>(TimeUnit.SECONDS.toMillis(30));
|
||||||
|
|
||||||
DockingDevice device = deviceService.getDevice(deviceId);
|
DockingDevice device = deviceService.getDevice(deviceId);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
@ -73,7 +74,9 @@ public class RecordService {
|
|||||||
List<RecordInfoItemDTO> list = new ArrayList<>();
|
List<RecordInfoItemDTO> list = new ArrayList<>();
|
||||||
AtomicLong sum = new AtomicLong(0);
|
AtomicLong sum = new AtomicLong(0);
|
||||||
AtomicLong getNum = new AtomicLong(0);
|
AtomicLong getNum = new AtomicLong(0);
|
||||||
subscribe.getRecordInfoSubscribe().addSubscribe(key, new Flow.Subscriber<>() {
|
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
|
||||||
|
final ScheduledFuture<?>[] schedule = new ScheduledFuture<?>[1];
|
||||||
|
Flow.Subscriber<RecordInfoResponseDTO> subscriber = new Flow.Subscriber<>() {
|
||||||
Flow.Subscription subscription;
|
Flow.Subscription subscription;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -90,10 +93,15 @@ public class RecordService {
|
|||||||
list.addAll(item.getRecordList());
|
list.addAll(item.getRecordList());
|
||||||
log.info("获取订阅 => {}, {}/{}", key, getNum.get(), sum.get());
|
log.info("获取订阅 => {}, {}/{}", key, getNum.get(), sum.get());
|
||||||
if (getNum.get() >= sum.get()) {
|
if (getNum.get() >= sum.get()) {
|
||||||
onComplete();
|
// 针对某些不按规范的设备
|
||||||
} else {
|
// 如果已获取数量 >= 约定的总数
|
||||||
subscription.request(1);
|
// 就执行定时任务, 若 500ms 内未收到新的数据视为已结束
|
||||||
|
if(schedule[0] != null){
|
||||||
|
schedule[0].cancel(true);
|
||||||
|
}
|
||||||
|
schedule[0] = scheduledExecutorService.schedule(this::onComplete, 500, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
subscription.request(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -103,11 +111,14 @@ public class RecordService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onComplete() {
|
public void onComplete() {
|
||||||
|
schedule[0].cancel(true);
|
||||||
subscribe.getRecordInfoSubscribe().delPublisher(key);
|
subscribe.getRecordInfoSubscribe().delPublisher(key);
|
||||||
result.setResult(JsonResponse.success(list));
|
result.setResult(JsonResponse.success(list));
|
||||||
log.debug("订阅结束 => {}", key);
|
log.debug("订阅结束 => {}", key);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
subscribe.getRecordInfoSubscribe().addSubscribe(key, subscriber);
|
||||||
|
|
||||||
result.onTimeout(()->{
|
result.onTimeout(()->{
|
||||||
result.setResult(JsonResponse.success(list,"查询超时, 结果可能不完整"));
|
result.setResult(JsonResponse.success(list,"查询超时, 结果可能不完整"));
|
||||||
|
Loading…
Reference in New Issue
Block a user