From 37a84e66917d6e22e03e31b0a115e2c16d23ed21 Mon Sep 17 00:00:00 2001 From: 朱俊杰 <502612493@qq.com> Date: 星期四, 10 二月 2022 14:45:33 +0800 Subject: [PATCH] 新增实时监控功能 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 108 +++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 75 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index d06c6c3..b56287b 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -4,22 +4,22 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.conf.MediaConfig; -import com.genersoft.iot.vmp.media.zlm.dto.IMediaServerItem; +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.service.IMediaServerService; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.service.IStreamProxyService; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; -import javax.print.attribute.standard.Media; import java.util.*; @Component @@ -40,52 +40,71 @@ private IStreamProxyService streamProxyService; @Autowired + private EventPublisher publisher; + + @Autowired private IMediaServerService mediaServerService; + + @Autowired + private IRedisCatchStorage redisCatchStorage; @Autowired private MediaConfig mediaConfig; + @Qualifier("taskExecutor") + @Autowired + private ThreadPoolTaskExecutor taskExecutor; + @Override public void run(String... strings) throws Exception { - IMediaServerItem presetMediaServer = mediaServerService.getOneByHostAndPort( - mediaConfig.getIp(), mediaConfig.getHttpPort()); - if (presetMediaServer != null) { - mediaConfig.setId(presetMediaServer.getId()); - mediaServerService.update(mediaConfig); + mediaServerService.clearMediaServerForOnline(); + MediaServerItem defaultMediaServer = mediaServerService.getDefaultMediaServer(); + if (defaultMediaServer == null) { + mediaServerService.addToDatabase(mediaConfig.getMediaSerItem()); + }else { + MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem(); + mediaSerItem.setId(defaultMediaServer.getId()); + mediaServerService.updateToDatabase(mediaSerItem); } // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁� hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null, - (IMediaServerItem mediaServerItem, JSONObject response)->{ + (MediaServerItem mediaServerItem, JSONObject response)->{ ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class); if (zlmServerConfig !=null ) { - startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); - mediaServerService.handLeZLMServerConfig(zlmServerConfig); -// zLmRunning(zlmServerConfig); + if (startGetMedia != null) { + startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); + } + mediaServerService.zlmServerOnline(zlmServerConfig); } }); + // 璁㈤槄 zlm淇濇椿浜嬩欢, 褰搝lm绂荤嚎鏃跺仛涓氬姟鐨勫鐞� + hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,null, + (MediaServerItem mediaServerItem, JSONObject response)->{ + String mediaServerId = response.getString("mediaServerId"); + if (mediaServerId !=null ) { + mediaServerService.updateMediaServerKeepalive(mediaServerId, response.getJSONObject("data")); + } + }); + // 鑾峰彇zlm淇℃伅 - logger.info("绛夊緟榛樿zlm鎺ュ叆..."); + logger.info("[zlm鎺ュ叆]绛夊緟榛樿zlm涓�..."); // 鑾峰彇鎵�鏈夌殑zlm锛� 骞跺紑鍚富鍔ㄨ繛鎺� - List<IMediaServerItem> all = mediaServerService.getAll(); - if (presetMediaServer == null) { + List<MediaServerItem> all = mediaServerService.getAllFromDatabase(); + if (all.size() == 0) { all.add(mediaConfig.getMediaSerItem()); } - for (IMediaServerItem mediaServerItem : all) { + for (MediaServerItem mediaServerItem : all) { if (startGetMedia == null) startGetMedia = new HashMap<>(); startGetMedia.put(mediaServerItem.getId(), true); - new Thread(() -> { - ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem); - if (zlmServerConfig != null) { - startGetMedia.remove(mediaServerItem.getId()); - mediaServerService.handLeZLMServerConfig(zlmServerConfig); - } - }).start(); + taskExecutor.execute(()->{ + connectZlmServer(mediaServerItem); + }); } Timer timer = new Timer(); - // 1鍒嗛挓鍚庢湭杩炴帴鍒板垯涓嶅啀鍘讳富鍔ㄨ繛鎺� + // 10鍒嗛挓鍚庢湭杩炴帴鍒板垯涓嶅啀鍘讳富鍔ㄨ繛鎺�, TODO 骞跺閲嶅惎鍓嶄娇鐢ㄦ鍦▃lm鐨勯�氶亾鍙戦�乥ye timer.schedule(new TimerTask() { @Override public void run() { @@ -93,15 +112,33 @@ Set<String> allZlmId = startGetMedia.keySet(); for (String id : allZlmId) { logger.error("[ {} ]]涓诲姩杩炴帴澶辫触锛屼笉鍐嶄富鍔ㄨ繛鎺�", id); - startGetMedia.put(id, false); } + startGetMedia = null; } + // TODO 娓呯悊鏁版嵁搴撲腑涓巖edis涓嶅尮閰嶇殑zlm } - }, 60 * 1000 * 2); + }, 60 * 1000 * 10); } - public ZLMServerConfig getMediaServerConfig(IMediaServerItem mediaServerItem) { - if ( startGetMedia.get(mediaServerItem.getId()) == null || !startGetMedia.get(mediaServerItem.getId())) return null; + @Async + public void connectZlmServer(MediaServerItem mediaServerItem){ + ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem, 1); + if (zlmServerConfig != null) { + zlmServerConfig.setIp(mediaServerItem.getIp()); + zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort()); + startGetMedia.remove(mediaServerItem.getId()); + mediaServerService.zlmServerOnline(zlmServerConfig); + } + } + + public ZLMServerConfig getMediaServerConfig(MediaServerItem mediaServerItem, int index) { + if (startGetMedia == null) { return null;} + if (!mediaServerItem.isDefaultServer() && mediaServerService.getOne(mediaServerItem.getId()) == null) { + return null; + } + if ( startGetMedia.get(mediaServerItem.getId()) == null || !startGetMedia.get(mediaServerItem.getId())) { + return null; + } JSONObject responseJSON = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); ZLMServerConfig ZLMServerConfig = null; if (responseJSON != null) { @@ -111,14 +148,19 @@ ZLMServerConfig.setIp(mediaServerItem.getIp()); } } else { - logger.error("[ {} ]-[ {}:{} ]涓诲姩杩炴帴澶辫触澶辫触, 2s鍚庨噸璇�", - mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + logger.error("[ {} ]-[ {}:{} ]绗瑊}娆′富鍔ㄨ繛鎺ュけ璐�, 2s鍚庨噸璇�", + mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort(), index); + if (index == 1 && !StringUtils.isEmpty(mediaServerItem.getId())) { + logger.info("[ {} ]-[ {}:{} ]绗瑊}娆′富鍔ㄨ繛鎺ュけ璐�, 寮�濮嬫竻鐞嗙浉鍏宠祫婧�", + mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort(), index); + publisher.zlmOfflineEventPublish(mediaServerItem.getId()); + } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } - ZLMServerConfig = getMediaServerConfig(mediaServerItem); + ZLMServerConfig = getMediaServerConfig(mediaServerItem, index += 1); } return ZLMServerConfig; -- Gitblit v1.8.0