From 5e3073005d286ba7fe9dfced7f4a7a26e5452ebb Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 20 三月 2024 00:26:04 +0800
Subject: [PATCH] 优化zlm状态管理
---
src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java | 5 +
src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerKeepaliveEvent.java | 24 ++++++
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManger.java | 146 +++++++++++++++++++++++++++++++++++-
src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java | 19 ++--
4 files changed, 179 insertions(+), 15 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java b/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java
index 9373968..4217e14 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java
@@ -57,6 +57,7 @@
@Override
public void run(String... strings) throws Exception {
+ // TODO 鑾峰彇鎵�鏈夌殑绂荤嚎鑺傜偣淇℃伅
mediaServerService.clearMediaServerForOnline();
MediaServerItem defaultMediaServer = mediaServerService.getDefaultMediaServer();
if (defaultMediaServer == null) {
@@ -67,7 +68,11 @@
}
// 鍙戦�佸獟浣撹妭鐐瑰彉鍖栦簨浠�
mediaServerService.syncCatchFromDatabase();
+ // 鑾峰彇鎵�鏈夌殑zlm锛� 骞跺紑鍚富鍔ㄨ繛鎺�
+ List<MediaServerItem> all = mediaServerService.getAllFromDatabase();
+
MediaServerChangeEvent event = new MediaServerChangeEvent(this);
+ event.setMediaServerItem();
applicationEventPublisher.publishEvent(event);
// TODO 姝ゅ浠ヤ笅浠g爜寮冪敤
diff --git a/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
index 2c421ba..aa3efce 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/service/impl/MediaServerServiceImpl.java
@@ -264,6 +264,9 @@
}
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItemInDataBase.getId();
redisTemplate.opsForValue().set(key, mediaServerItemInDataBase);
+ if (mediaSerItem.isStatus()) {
+ resetOnlineServerItem(mediaSerItem);
+ }
}
@Override
@@ -498,20 +501,18 @@
if (redisTemplate.opsForZSet().score(key, serverItem.getId()) == null) { // 涓嶅瓨鍦ㄥ垯璁剧疆榛樿鍊� 宸插瓨鍦ㄥ垯閲嶇疆
redisTemplate.opsForZSet().add(key, serverItem.getId(), 0L);
// 鏌ヨ鏈嶅姟娴佹暟閲�
- zlmresTfulUtils.getMediaList(serverItem, null, null, "rtsp",(mediaList ->{
- Integer code = mediaList.getInteger("code");
- if (code == 0) {
- JSONArray data = mediaList.getJSONArray("data");
- if (data != null) {
- redisTemplate.opsForZSet().add(key, serverItem.getId(), data.size());
- }
- }
- }));
+ int count = getMediaList(serverItem);
+ redisTemplate.opsForZSet().add(key, serverItem.getId(), count);
}else {
clearRTPServer(serverItem);
}
}
+ private int getMediaList(MediaServerItem serverItem) {
+
+ return 0;
+ }
+
@Override
public void addCount(String mediaServerId) {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManger.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManger.java
index bf39690..ef0c67a 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManger.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManger.java
@@ -1,13 +1,23 @@
package com.genersoft.iot.vmp.media.zlm;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.media.event.MediaServerChangeEvent;
+import com.genersoft.iot.vmp.media.service.IMediaServerService;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.media.zlm.dto.ZLMServerConfig;
+import com.genersoft.iot.vmp.media.zlm.event.HookZlmServerKeepaliveEvent;
import com.genersoft.iot.vmp.media.zlm.event.HookZlmServerStartEvent;
+import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -15,11 +25,23 @@
/**
* 绠$悊zlm娴佸獟浣撹妭鐐圭殑鐘舵��
*/
+@Component
public class ZLMMediaServerStatusManger {
private final static Logger logger = LoggerFactory.getLogger(ZLMMediaServerStatusManger.class);
- private Map<Object, MediaServerItem> offlineZlmMap = new ConcurrentHashMap<>();
+ private final Map<Object, MediaServerItem> offlineZlmPrimaryMap = new ConcurrentHashMap<>();
+ private final Map<Object, MediaServerItem> offlineZlmsecondaryMap = new ConcurrentHashMap<>();
+ private final Map<Object, Long> offlineZlmTimeMap = new ConcurrentHashMap<>();
+
+ @Autowired
+ private ZLMRESTfulUtils zlmresTfulUtils;
+
+ @Autowired
+ private IMediaServerService mediaServerService;
+
+ @Autowired
+ private DynamicTask dynamicTask;
private final String type = "zlm";
@@ -31,8 +53,9 @@
|| event.getMediaServerItem().isStatus()) {
return;
}
- logger.info("[ZLM 寰呬笂绾胯妭鐐瑰彉鍖朷 ID锛�" + event.getMediaServerItem().getId());
- offlineZlmMap.put(event.getMediaServerItem().getId(), event.getMediaServerItem());
+ logger.info("[ZLM-娣诲姞寰呬笂绾胯妭鐐筣 ID锛�" + event.getMediaServerItem().getId());
+ offlineZlmPrimaryMap.put(event.getMediaServerItem().getId(), event.getMediaServerItem());
+ offlineZlmTimeMap.put(event.getMediaServerItem().getId(), System.currentTimeMillis());
}
@Async("taskExecutor")
@@ -43,13 +66,124 @@
|| event.getMediaServerItem().isStatus()) {
return;
}
+ MediaServerItem serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
+ if (serverItem == null) {
+ return;
+ }
logger.info("[ZLM-HOOK浜嬩欢-鏈嶅姟鍚姩] ID锛�" + event.getMediaServerItem().getId());
- offlineZlmMap.remove(event.getMediaServerItem().getId());
+ online(serverItem);
}
- @Scheduled(fixedDelay = ) //姣忓ぉ鐨�0鐐规墽琛�
- public void execute(){
+ @Async("taskExecutor")
+ @EventListener
+ public void onApplicationEvent(HookZlmServerKeepaliveEvent event) {
+ if (event.getMediaServerItem() == null
+ || !type.equals(event.getMediaServerItem().getType())
+ || event.getMediaServerItem().isStatus()) {
+ return;
+ }
+ MediaServerItem serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
+ if (serverItem == null) {
+ return;
+ }
+ logger.info("[ZLM-HOOK浜嬩欢-蹇冭烦] ID锛�" + event.getMediaServerItem().getId());
+ online(serverItem);
+ }
+ @Scheduled(fixedDelay = 10*1000) //姣忛殧10绉掓鏌ヤ竴娆�
+ public void execute(){
+ // 鍒濇鍔犲叆鐨勭绾胯妭鐐逛細鍦�30鍒嗛挓鍐咃紝姣忛棿闅斿崄绉掑皾璇曚竴娆★紝30鍒嗛挓鍚庡鏋滀粛鐒舵病鏈変笂绾匡紝鍒欐瘡闅�30鍒嗛挓灏濊瘯涓�娆¤繛鎺�
+ if (offlineZlmPrimaryMap.isEmpty() && offlineZlmsecondaryMap.isEmpty()) {
+ return;
+ }
+ if (!offlineZlmPrimaryMap.isEmpty()) {
+ for (MediaServerItem mediaServerItem : offlineZlmPrimaryMap.values()) {
+ if (offlineZlmTimeMap.get(mediaServerItem.getId()) > 30*60*1000) {
+ offlineZlmsecondaryMap.put(mediaServerItem.getId(), mediaServerItem);
+ offlineZlmPrimaryMap.remove(mediaServerItem.getId());
+ continue;
+ }
+ logger.info("[ZLM-灏濊瘯杩炴帴] ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ JSONObject responseJson = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
+ ZLMServerConfig zlmServerConfig = null;
+ if (responseJson == null) {
+ logger.info("[ZLM-灏濊瘯杩炴帴]澶辫触, ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ continue;
+ }
+ JSONArray data = responseJson.getJSONArray("data");
+ if (data == null || data.isEmpty()) {
+ logger.info("[ZLM-灏濊瘯杩炴帴]澶辫触, ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ }else {
+ zlmServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class);
+ initPort(mediaServerItem, zlmServerConfig);
+ online(mediaServerItem);
+ }
+ }
+ }
+ if (!offlineZlmsecondaryMap.isEmpty()) {
+ for (MediaServerItem mediaServerItem : offlineZlmsecondaryMap.values()) {
+ if (offlineZlmTimeMap.get(mediaServerItem.getId()) < 30*60*1000) {
+ continue;
+ }
+ logger.info("[ZLM-灏濊瘯杩炴帴] ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ JSONObject responseJson = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
+ ZLMServerConfig zlmServerConfig = null;
+ if (responseJson == null) {
+ logger.info("[ZLM-灏濊瘯杩炴帴]澶辫触, ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
+ continue;
+ }
+ JSONArray data = responseJson.getJSONArray("data");
+ if (data == null || data.isEmpty()) {
+ logger.info("[ZLM-灏濊瘯杩炴帴]澶辫触, ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
+ }else {
+ zlmServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class);
+ initPort(mediaServerItem, zlmServerConfig);
+ online(mediaServerItem);
+ }
+ }
+ }
+ }
+
+ private void online(MediaServerItem mediaServerItem) {
+ logger.info("[ZLM-杩炴帴鎴愬姛] ID锛歿}, 鍦板潃锛� {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
+ offlineZlmPrimaryMap.remove(mediaServerItem.getId());
+ offlineZlmsecondaryMap.remove(mediaServerItem.getId());
+ offlineZlmTimeMap.remove(mediaServerItem.getId());
+ if (!mediaServerItem.isStatus()) {
+ mediaServerItem.setStatus(true);
+ mediaServerService.update(mediaServerItem);
+ }
+ // 璁剧疆涓ゆ蹇冭烦鏈敹鍒板垯璁や负zlm绂荤嚎
+ String key = "zlm-keepalive-" + mediaServerItem.getId();
+ dynamicTask.startDelay(key, ()->{
+ logger.warn("[ZLM-蹇冭烦瓒呮椂] ID锛歿}", mediaServerItem.getId());
+ mediaServerItem.setStatus(false);
+ offlineZlmPrimaryMap.put(mediaServerItem.getId(), mediaServerItem);
+ offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
+ }, (int)(mediaServerItem.getHookAliveInterval() * 2 * 1000));
+ }
+ private void initPort(MediaServerItem mediaServerItem, ZLMServerConfig zlmServerConfig) {
+ if (mediaServerItem.getHttpSSlPort() == 0) {
+ mediaServerItem.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
+ }
+ if (mediaServerItem.getRtmpPort() == 0) {
+ mediaServerItem.setRtmpPort(zlmServerConfig.getRtmpPort());
+ }
+ if (mediaServerItem.getRtmpSSlPort() == 0) {
+ mediaServerItem.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
+ }
+ if (mediaServerItem.getRtspPort() == 0) {
+ mediaServerItem.setRtspPort(zlmServerConfig.getRtspPort());
+ }
+ if (mediaServerItem.getRtspSSLPort() == 0) {
+ mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
+ }
+ if (mediaServerItem.getRtpProxyPort() == 0) {
+ mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
+ }
+ mediaServerItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval());
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerKeepaliveEvent.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerKeepaliveEvent.java
new file mode 100644
index 0000000..aa6431f
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerKeepaliveEvent.java
@@ -0,0 +1,24 @@
+package com.genersoft.iot.vmp.media.zlm.event;
+
+import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * zlm 蹇冭烦浜嬩欢
+ */
+public class HookZlmServerKeepaliveEvent extends ApplicationEvent {
+
+ public HookZlmServerKeepaliveEvent(Object source) {
+ super(source);
+ }
+
+ private MediaServerItem mediaServerItem;
+
+ public MediaServerItem getMediaServerItem() {
+ return mediaServerItem;
+ }
+
+ public void setMediaServerItem(MediaServerItem mediaServerItem) {
+ this.mediaServerItem = mediaServerItem;
+ }
+}
--
Gitblit v1.8.0