Commit d18b8c53d7e12905c7c9ed98bbe943a69ca40da6
1 parent
e8fc19d8
优化
Showing
9 changed files
with
98 additions
and
55 deletions
Too many changes to show.
To preserve performance only 9 of 11 files are displayed.
src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
src/main/java/com/genersoft/iot/vmp/conf/StreamProxyTask.java
| 1 | 1 | package com.genersoft.iot.vmp.conf; |
| 2 | 2 | |
| 3 | +import com.genersoft.iot.vmp.VManageBootstrap; | |
| 4 | +import com.genersoft.iot.vmp.service.IMediaServerService; | |
| 5 | +import com.genersoft.iot.vmp.service.IStreamProxyService; | |
| 3 | 6 | import com.genersoft.iot.vmp.service.StremProxyService1078; |
| 7 | +import com.genersoft.iot.vmp.service.impl.StreamProxyServiceImpl; | |
| 4 | 8 | import org.apache.commons.collections4.CollectionUtils; |
| 5 | 9 | import org.apache.commons.lang3.StringUtils; |
| 6 | 10 | import org.slf4j.Logger; |
| ... | ... | @@ -17,63 +21,20 @@ import java.util.concurrent.TimeUnit; |
| 17 | 21 | |
| 18 | 22 | @Component |
| 19 | 23 | public class StreamProxyTask { |
| 20 | - @Autowired | |
| 21 | - private RedisTemplate redisTemplate; | |
| 22 | - @Autowired | |
| 23 | - private StremProxyService1078 stremProxyService1078; | |
| 24 | - private Logger logger = LoggerFactory.getLogger(StreamProxyTask.class); | |
| 25 | 24 | |
| 26 | 25 | public static final Long TIME_OUT = 180L; |
| 26 | + @Autowired | |
| 27 | + private IStreamProxyService streamProxyService; | |
| 27 | 28 | |
| 28 | 29 | @Scheduled(cron = "0 15 * * * ? ") |
| 29 | 30 | public void work() { |
| 30 | - Set<String> keys = redisTemplate.keys("tag:history:port:*"); | |
| 31 | - if (CollectionUtils.isEmpty(keys)) { | |
| 32 | - return; | |
| 33 | - } | |
| 34 | - Long nowDate = new Date().getTime(); | |
| 35 | - for (String key : keys) { | |
| 36 | - String stream = StringUtils.substringAfter(key, "tag:history:port:"); | |
| 37 | - if (StringUtils.isEmpty(stream)) { | |
| 38 | - continue; | |
| 39 | - } | |
| 40 | - | |
| 41 | - Object value = redisTemplate.opsForValue().get("tag:history:httpPort:time:"+stream); | |
| 42 | - if(Objects.isNull(value)){ | |
| 43 | - sendIORequestStop(stream); | |
| 44 | - continue; | |
| 45 | - } | |
| 46 | - try { | |
| 47 | - Long val = (Long) value; | |
| 48 | - if(val == 0L){ | |
| 49 | - sendIORequestStop(stream); | |
| 50 | - continue; | |
| 51 | - } | |
| 52 | - | |
| 53 | - Long val1 = (nowDate-val)/1000; | |
| 54 | - if(val1 > TIME_OUT){ | |
| 55 | - sendIORequestStop(stream); | |
| 56 | - } | |
| 57 | - | |
| 58 | - }catch (Exception e){ | |
| 59 | - logger.error("[{}]停流失败",stream,e); | |
| 60 | - } | |
| 61 | - } | |
| 31 | + streamProxyService.choose1078Lister(); | |
| 62 | 32 | |
| 63 | 33 | // task execution logic |
| 64 | 34 | } |
| 65 | 35 | |
| 66 | - private void sendIORequestStop(String stream){ | |
| 67 | - try { | |
| 68 | - String sim = StringUtils.substringBeforeLast(stream,"-"); | |
| 69 | - String channel = StringUtils.substringAfterLast(stream,"-"); | |
| 70 | - Object port = redisTemplate.opsForValue().get("tag:history:port:" + stream); | |
| 71 | - Object portHtt = redisTemplate.opsForValue().get("tag:history:httpPort:" + stream); | |
| 72 | - stremProxyService1078.sendIORequestStop(sim,channel,stream, (Integer) port, (Integer) portHtt); | |
| 36 | + private void sendIORequestStop(String stream) { | |
| 73 | 37 | |
| 74 | - }catch (Exception e){ | |
| 75 | - logger.error("[{}]停流失败",stream,e); | |
| 76 | - } | |
| 77 | 38 | |
| 78 | 39 | } |
| 79 | 40 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| ... | ... | @@ -132,6 +132,9 @@ public class ZLMHttpHookListener { |
| 132 | 132 | @Autowired |
| 133 | 133 | private Jt1078OfCarController jt1078OfCarController; |
| 134 | 134 | |
| 135 | + @Autowired | |
| 136 | + private StremProxyService1078 stremProxyService1078; | |
| 137 | + | |
| 135 | 138 | |
| 136 | 139 | /** |
| 137 | 140 | * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 |
| ... | ... | @@ -558,6 +561,7 @@ public class ZLMHttpHookListener { |
| 558 | 561 | param.getApp(), param.getStream()); |
| 559 | 562 | JSONObject ret = new JSONObject(); |
| 560 | 563 | ret.put("code", 0); |
| 564 | + stremProxyService1078.sendIORequestStop(param.getStream()); | |
| 561 | 565 | // 国标类型的流 |
| 562 | 566 | if ("rtp".equals(param.getApp())) { |
| 563 | 567 | ret.put("close", userSetting.getStreamOnDemand()); |
| ... | ... | @@ -669,6 +673,8 @@ public class ZLMHttpHookListener { |
| 669 | 673 | } |
| 670 | 674 | return ret; |
| 671 | 675 | } |
| 676 | + | |
| 677 | + | |
| 672 | 678 | // TODO 推流具有主动性,暂时不做处理 |
| 673 | 679 | // StreamPushItem streamPushItem = streamPushService.getPush(app, streamId); |
| 674 | 680 | // if (streamPushItem != null) { | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
| ... | ... | @@ -3,9 +3,11 @@ package com.genersoft.iot.vmp.service.impl; |
| 3 | 3 | import com.alibaba.fastjson2.JSONArray; |
| 4 | 4 | import com.alibaba.fastjson2.JSONObject; |
| 5 | 5 | import com.baomidou.dynamic.datasource.annotation.DS; |
| 6 | +import com.genersoft.iot.vmp.VManageBootstrap; | |
| 6 | 7 | import com.genersoft.iot.vmp.common.GeneralCallback; |
| 7 | 8 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 8 | 9 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 10 | +import com.genersoft.iot.vmp.conf.StreamProxyTask; | |
| 9 | 11 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 10 | 12 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 11 | 13 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| ... | ... | @@ -419,8 +421,8 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 419 | 421 | result = true; |
| 420 | 422 | streamProxy.setEnable(true); |
| 421 | 423 | updateStreamProxy(streamProxy); |
| 422 | - }else if(jsonObject.getInteger("code") == -1){ | |
| 423 | - redisTemplate.opsForValue().set("stream:status:"+stream,"1",30, TimeUnit.SECONDS); | |
| 424 | + } else if (jsonObject.getInteger("code") == -1) { | |
| 425 | + redisTemplate.opsForValue().set("stream:status:" + stream, "1", 30, TimeUnit.SECONDS); | |
| 424 | 426 | } else { |
| 425 | 427 | logger.info("启用代理失败: {}/{}->{}({})", app, stream, jsonObject.getString("msg"), |
| 426 | 428 | streamProxy.getSrcUrl() == null ? streamProxy.getUrl() : streamProxy.getSrcUrl()); |
| ... | ... | @@ -471,6 +473,8 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 471 | 473 | @Override |
| 472 | 474 | public void zlmServerOnline(String mediaServerId) { |
| 473 | 475 | // 移除开启了无人观看自动移除的流 |
| 476 | + | |
| 477 | + choose1078Lister(); | |
| 474 | 478 | List<StreamProxyItem> streamProxyItemList = streamProxyMapper.selectAutoRemoveItemByMediaServerId(mediaServerId); |
| 475 | 479 | if (streamProxyItemList.size() > 0) { |
| 476 | 480 | gbStreamMapper.batchDel(streamProxyItemList); |
| ... | ... | @@ -623,4 +627,59 @@ public class StreamProxyServiceImpl implements IStreamProxyService { |
| 623 | 627 | updateStreamProxy(streamProxyItem); |
| 624 | 628 | } |
| 625 | 629 | } |
| 630 | + | |
| 631 | + | |
| 632 | + public void choose1078Lister() { | |
| 633 | + Set<String> keys = redisTemplate.keys("tag:history:port:*"); | |
| 634 | + if (org.apache.commons.collections4.CollectionUtils.isEmpty(keys)) { | |
| 635 | + return; | |
| 636 | + } | |
| 637 | + Long nowDate = new Date().getTime(); | |
| 638 | + for (String key : keys) { | |
| 639 | + String stream = StringUtils.substringAfter(key, "tag:history:port:"); | |
| 640 | + if (StringUtils.isEmpty(stream)) { | |
| 641 | + continue; | |
| 642 | + } | |
| 643 | + | |
| 644 | + Object value = redisTemplate.opsForValue().get("tag:history:httpPort:time:" + stream); | |
| 645 | + if (Objects.isNull(value)) { | |
| 646 | + sendIORequestStop(stream); | |
| 647 | + continue; | |
| 648 | + } | |
| 649 | + try { | |
| 650 | + Long val = (Long) value; | |
| 651 | + if (val == 0L) { | |
| 652 | + sendIORequestStop(stream); | |
| 653 | + continue; | |
| 654 | + } | |
| 655 | + | |
| 656 | + Long val1 = (nowDate - val) / 1000; | |
| 657 | + if (val1 > StreamProxyTask.TIME_OUT) { | |
| 658 | + sendIORequestStop(stream); | |
| 659 | + } | |
| 660 | + | |
| 661 | + } catch (Exception e) { | |
| 662 | + logger.error("[{}]停流失败", stream, e); | |
| 663 | + } | |
| 664 | + } | |
| 665 | + | |
| 666 | + // task execution logic | |
| 667 | + } | |
| 668 | + | |
| 669 | + private void sendIORequestStop(String stream) { | |
| 670 | + try { | |
| 671 | + String sim = StringUtils.substringBeforeLast(stream, "-"); | |
| 672 | + String channel = StringUtils.substringAfterLast(stream, "-"); | |
| 673 | + Object port = redisTemplate.opsForValue().get("tag:history:port:" + stream); | |
| 674 | + Object portHtt = redisTemplate.opsForValue().get("tag:history:httpPort:" + stream); | |
| 675 | + stremProxyService1078.sendIORequestStop(sim, channel, stream, (Integer) port, (Integer) portHtt); | |
| 676 | + | |
| 677 | + del("schedule", stream); | |
| 678 | + // VManageBootstrap.getBean(StreamProxyServiceImpl.class).del("schedule", stream); | |
| 679 | + | |
| 680 | + } catch (Exception e) { | |
| 681 | + logger.error("[{}]停流失败", stream, e); | |
| 682 | + } | |
| 683 | + | |
| 684 | + } | |
| 626 | 685 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/StremProxyService1078Impl.java
| ... | ... | @@ -32,6 +32,7 @@ public class StremProxyService1078Impl implements StremProxyService1078 { |
| 32 | 32 | @Autowired |
| 33 | 33 | private RedisTemplate<Object, Object> redisTemplate; |
| 34 | 34 | |
| 35 | + | |
| 35 | 36 | private static final Logger log = LoggerFactory.getLogger(StremProxyService1078Impl.class); |
| 36 | 37 | |
| 37 | 38 | |
| ... | ... | @@ -71,7 +72,7 @@ public class StremProxyService1078Impl implements StremProxyService1078 { |
| 71 | 72 | log.info(entity.getResultStr()); |
| 72 | 73 | } |
| 73 | 74 | |
| 74 | - | |
| 75 | +// streamProxyService.del("schedule", stream); | |
| 75 | 76 | resultMap.put("code", "1"); |
| 76 | 77 | resultMap.put("message", "OK"); |
| 77 | 78 | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/Jt1078OfCarController.java
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/TuohuaConfigBean.java
| ... | ... | @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.vmanager.jt1078.platform.config; |
| 3 | 3 | import com.alibaba.fastjson2.JSON; |
| 4 | 4 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.ben.HttpClientPostEntity; |
| 5 | 5 | import com.genersoft.iot.vmp.vmanager.jt1078.platform.handler.HttpClientUtil; |
| 6 | +import com.xiaoleilu.hutool.convert.Convert; | |
| 6 | 7 | import org.apache.commons.collections4.CollectionUtils; |
| 7 | 8 | import org.apache.commons.lang3.RandomUtils; |
| 8 | 9 | import org.apache.commons.lang3.StringUtils; |
| ... | ... | @@ -94,7 +95,7 @@ public class TuohuaConfigBean { |
| 94 | 95 | private final String LINE_URL = "/line/company/{companyId}?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 95 | 96 | //private final String LINE_URL = "/line/all?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 96 | 97 | private final String CAR_URL = "/car/company/{companyId}?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; |
| 97 | - private final String GPS_URL = "//gps/all?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; | |
| 98 | + private final String GPS_URL = "/gps/all?timestamp={timestamp}&nonce={nonce}&password={password}&sign={sign}"; | |
| 98 | 99 | |
| 99 | 100 | public String requestLine(HttpClientUtil httpClientUtil, String companyId) throws Exception { |
| 100 | 101 | String nonce = random(5); |
| ... | ... | @@ -247,15 +248,25 @@ public class TuohuaConfigBean { |
| 247 | 248 | String sim = convertStr(ch.get("sim")); |
| 248 | 249 | String name = code; |
| 249 | 250 | |
| 251 | + Integer abnormalStatus = 1; | |
| 252 | + long now = new Date().getTime(); | |
| 253 | + | |
| 250 | 254 | Optional<HashMap> optional = gpsList.stream().filter(g -> Objects.nonNull(g) && Objects.nonNull(g.get("deviceId")) && |
| 251 | 255 | Objects.nonNull(ch.get("equipmentCode")) && Objects.equals(g.get("deviceId").toString(), ch.get("equipmentCode").toString())).findFirst(); |
| 252 | - if (StringUtils.isEmpty(sim) || !optional.isPresent() || Objects.isNull(optional.get().get("abnormalStatus")) || StringUtils.equalsIgnoreCase("offline", optional.get().get("abnormalStatus").toString())) { | |
| 253 | - name = "<del>" + name + "</del>"; | |
| 256 | + if (StringUtils.isEmpty(sim) || !optional.isPresent()) { | |
| 257 | + name = "<view style='color:red'>" + name + "</view>"; | |
| 258 | + abnormalStatus = 10; | |
| 259 | + }else if(Objects.isNull(optional.get().get("timestamp")) || now- Convert.toLong(optional.get().get("timestamp"))<=120000){ | |
| 260 | + name = "<view style='color:#ccc'>" + name + "</view>"; | |
| 261 | + abnormalStatus =20; | |
| 262 | + }else{ | |
| 263 | + name = "<view style='color:blue'>" + name + "</view>"; | |
| 254 | 264 | } |
| 255 | 265 | |
| 256 | 266 | HashMap<String, Object> hashMap = combationTree(code, "bus1", code, false, name, code, false, "<span><img src='/metronic_v4.5.4/layui/icon/bus1.png' class ='imageIcon' /></span><span>" + code + "</span>", |
| 257 | 267 | "<span><img src='/metronic_v4.5.4/layui/icon/bus1.png' class ='imageIcon' /></span><span>" + code + "</span>", 301); |
| 258 | 268 | hashMap.put("sim", formatSim(convertStr(ch.get("sim")))); |
| 269 | + hashMap.put("abnormalStatus",abnormalStatus); | |
| 259 | 270 | |
| 260 | 271 | if (StringUtils.equals(profileActive, "local")) { |
| 261 | 272 | // hashMap.put("sim","123456789011"); | ... | ... |
web_src/config/index.js