diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java index f766800e7..66ccc6266 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java @@ -15,19 +15,29 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.io.monitor.FileAlterationListener; +import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; +import org.apache.commons.io.monitor.FileAlterationMonitor; +import org.apache.commons.io.monitor.FileAlterationObserver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.File; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @ConditionalOnProperty(value = "jt1078.enable", havingValue = "true") @@ -44,6 +54,10 @@ public class JT1078Controller { @Autowired UserSetting userSetting; + @Qualifier("taskExecutor") + @Autowired + private ThreadPoolTaskExecutor taskExecutor; + @Operation(summary = "1078-开始点播", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @@ -781,15 +795,54 @@ public class JT1078Controller { @Operation(summary = "1078-存储多媒体数据上传命令", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "param", description = "存储多媒体数据参数", required = true) @PostMapping("/media-data-upload") - public WVPResult> updateMediaData(@RequestBody QueryMediaDataParam param){ + public DeferredResult>> updateMediaData(@RequestBody QueryMediaDataParam param){ logger.info("[1078-存储多媒体数据上传命令] param: {}", param ); - List ids = service.uploadMediaData(param.getDeviceId(), param.getQueryMediaDataCommand()); - if (ids != null) { - return WVPResult.success(ids); - }else { - return WVPResult.fail(ErrorCode.ERROR100); + DeferredResult>> deferredResult = new DeferredResult<>(30000L); + List resultList = new ArrayList<>(); + + deferredResult.onTimeout(()->{ + logger.info("[1078-存储多媒体数据上传命令超时] param: {}", param ); + WVPResult> fail = WVPResult.fail(ErrorCode.ERROR100); + fail.setMsg("超时"); + fail.setData(resultList); + deferredResult.setResult(fail); + }); + List ids = service.queryMediaData(param.getDeviceId(), param.getQueryMediaDataCommand()); + if (ids.isEmpty()) { + deferredResult.setResult(WVPResult.fail(ErrorCode.ERROR100)); + return deferredResult; } + Map idMap= new HashMap<>(); + for (JTMediaDataInfo mediaDataInfo : ids) { + idMap.put(mediaDataInfo.getId() + ".jpg", mediaDataInfo); + } + // 开启文件监听 + FileAlterationObserver observer = new FileAlterationObserver(new File("mediaEvent")); + observer.addListener(new FileAlterationListenerAdaptor() { + @Override + public void onFileCreate(File file) { + if (idMap.containsKey(file.getName())) { + idMap.remove(file.getName()); + resultList.add("mediaEvent" + File.separator + file.getName()); + if (idMap.isEmpty()) { + deferredResult.setResult(WVPResult.success(resultList)); + } + } + } + }); + FileAlterationMonitor monitor = new FileAlterationMonitor(5, observer); + try { + monitor.start(); + } catch (Exception e) { + logger.info("[1078-存储多媒体数据上传命令监听文件失败] param: {}", param ); + deferredResult.setResult(null); + return deferredResult; + } + taskExecutor.execute(()->{ + service.uploadMediaData(param.getDeviceId(), param.getQueryMediaDataCommand()); + }); + return deferredResult; } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java index ef620f337..62ed28292 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java @@ -34,7 +34,6 @@ public class J0801 extends Re { @Override protected Rs decode0(ByteBuf buf, Header header, Session session) { mediaEventInfo = JTMediaEventInfo.decode(buf); - System.out.println(mediaEventInfo.getId()); ByteBuf byteBuf = buf.readSlice(28); positionBaseInfo = JTPositionBaseInfo.decode(byteBuf); String fileName = "mediaEvent/" + mediaEventInfo.getId() + "."; @@ -72,7 +71,7 @@ public class J0801 extends Re { log.info("[JT-多媒体数据上传] 写入文件失败", e); } log.info("[JT-多媒体数据上传]: {}", mediaEventInfo); -// SessionManager.INSTANCE.response(header.getTerminalId(), "0801", null, mediaEventInfo); + SessionManager.INSTANCE.response(header.getTerminalId(), "0801", null, mediaEventInfo); return null; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index f7509f861..e1a6c798a 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -100,6 +100,6 @@ public interface Ijt1078Service { List queryMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand); - List uploadMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand); + void uploadMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index 8f9e4680c..771ae5632 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -721,9 +721,9 @@ public class jt1078ServiceImpl implements Ijt1078Service { } @Override - public List uploadMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand) { + public void uploadMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand) { J8803 j8803 = new J8803(); j8803.setCommand(queryMediaDataCommand); - return (List)jt1078Template.uploadMediaData(deviceId, j8803, 300); + jt1078Template.uploadMediaData(deviceId, j8803, 10); } }