diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java index 51a586c97..d8b5dda0c 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java @@ -44,42 +44,6 @@ public class MediaConfig{ @Value("${media.http-port:0}") private Integer httpPort; - @Value("${media.flv-port:0}") - private Integer flvPort = 0; - - @Value("${media.mp4-port:0}") - private Integer mp4Port = 0; - - @Value("${media.ws-flv-port:0}") - private Integer wsFlvPort = 0; - - @Value("${media.http-ssl-port:0}") - private Integer httpSSlPort = 0; - - @Value("${media.flv-ssl-port:0}") - private Integer flvSSlPort = 0; - - @Value("${media.ws-flv-ssl-port:0}") - private Integer wsFlvSSlPort = 0; - - @Value("${media.rtmp-port:0}") - private Integer rtmpPort = 0; - - @Value("${media.rtmp-ssl-port:0}") - private Integer rtmpSSlPort = 0; - - @Value("${media.rtp-proxy-port:0}") - private Integer rtpProxyPort = 0; - - @Value("${media.jtt-proxy-port:0}") - private Integer jttProxyPort = 0; - - @Value("${media.rtsp-port:0}") - private Integer rtspPort = 0; - - @Value("${media.rtsp-ssl-port:0}") - private Integer rtspSSLPort = 0; - @Value("${media.auto-config:true}") private boolean autoConfig = true; @@ -108,24 +72,6 @@ public class MediaConfig{ private String type; - - public int getRtpProxyPort() { - if (rtpProxyPort == null) { - return 0; - }else { - return rtpProxyPort; - } - - } - - public Integer getJttProxyPort() { - if (jttProxyPort == null) { - return 0; - }else { - return jttProxyPort; - } - } - public String getSdpIp() { if (ObjectUtils.isEmpty(sdpIp)){ return ip; @@ -153,7 +99,7 @@ public class MediaConfig{ } } - public MediaServer getMediaSerItem(){ + public MediaServer buildMediaSer(){ MediaServer mediaServer = new MediaServer(); mediaServer.setId(id); mediaServer.setIp(ip); @@ -162,19 +108,6 @@ public class MediaConfig{ mediaServer.setSdpIp(getSdpIp()); mediaServer.setStreamIp(getStreamIp()); mediaServer.setHttpPort(httpPort); - mediaServer.setFlvPort(flvPort); - mediaServer.setMp4Port(mp4Port); - mediaServer.setWsFlvPort(wsFlvPort); - mediaServer.setFlvSSLPort(flvSSlPort); - mediaServer.setWsFlvSSLPort(wsFlvSSlPort); - - mediaServer.setHttpSSlPort(httpSSlPort); - mediaServer.setRtmpPort(rtmpPort); - mediaServer.setRtmpSSlPort(rtmpSSlPort); - mediaServer.setRtpProxyPort(getRtpProxyPort()); - mediaServer.setJttProxyPort(getJttProxyPort()); - mediaServer.setRtspPort(rtspPort); - mediaServer.setRtspSSLPort(rtspSSLPort); mediaServer.setAutoConfig(autoConfig); mediaServer.setSecret(secret); mediaServer.setRtpEnable(rtpEnable); 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 ba27fb350..ccd63089d 100755 --- a/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/media/MediaServerConfig.java @@ -39,26 +39,14 @@ public class MediaServerConfig implements CommandLineRunner { public void run(String... strings) throws Exception { // 清理所有在线节点的缓存信息 mediaServerService.clearMediaServerForOnline(); - MediaServer defaultMediaServer = mediaServerService.getDefaultMediaServer(); - MediaServer mediaSerItemInConfig = mediaConfig.getMediaSerItem(); + MediaServer mediaSerItemInConfig = mediaConfig.buildMediaSer(); mediaSerItemInConfig.setServerId(userSetting.getServerId()); - if (defaultMediaServer != null && mediaSerItemInConfig.getId().equals(defaultMediaServer.getId())) { - mediaServerService.update(mediaSerItemInConfig); - }else { - if (defaultMediaServer != null) { - mediaServerService.delete(defaultMediaServer); - } - MediaServer mediaServerItem = mediaServerService.getOneFromDatabase(mediaSerItemInConfig.getId()); - if (mediaServerItem == null) { - mediaServerService.add(mediaSerItemInConfig); - }else { - mediaServerService.update(mediaSerItemInConfig); - } - } + mediaServerService.deleteDefault(); // 发送媒体节点变化事件 mediaServerService.syncCatchFromDatabase(); // 获取所有的zlm, 并开启主动连接 - List all = mediaServerService.getAllFromDatabase(); + List all = mediaServerService.getAllFromDatabaseWithOutDefault(); + all.add(mediaSerItemInConfig); log.info("[媒体节点] 加载节点列表, 共{}个节点", all.size()); MediaServerChangeEvent event = new MediaServerChangeEvent(this); event.setMediaServerItemList(all); diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java index a820851dd..24d446511 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.abl; import com.alibaba.fastjson2.JSONArray; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.media.abl.bean.ABLResult; import com.genersoft.iot.vmp.media.abl.bean.AblServerConfig; import com.genersoft.iot.vmp.media.abl.bean.ConfigKeyId; @@ -12,8 +13,7 @@ import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerChangeEvent; import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerDeleteEvent; import com.genersoft.iot.vmp.media.service.IMediaServerService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.event.EventListener; @@ -29,10 +29,9 @@ import java.util.concurrent.ConcurrentHashMap; * 管理zlm流媒体节点的状态 */ @Component +@Slf4j public class ABLMediaServerStatusManger { - - private final static Logger logger = LoggerFactory.getLogger(ABLMediaServerStatusManger.class); - + private final Map offlineABLPrimaryMap = new ConcurrentHashMap<>(); private final Map offlineAblsecondaryMap = new ConcurrentHashMap<>(); private final Map offlineAblTimeMap = new ConcurrentHashMap<>(); @@ -55,6 +54,9 @@ public class ABLMediaServerStatusManger { @Autowired private UserSetting userSetting; + @Autowired + private EventPublisher eventPublisher; + private final String type = "abl"; @Async("taskExecutor") @@ -68,7 +70,7 @@ public class ABLMediaServerStatusManger { if (!type.equals(mediaServer.getType())) { continue; } - logger.info("[ABL-添加待上线节点] ID:" + mediaServer.getId()); + log.info("[ABL-添加待上线节点] ID:" + mediaServer.getId()); offlineABLPrimaryMap.put(mediaServer.getId(), mediaServer); offlineAblTimeMap.put(mediaServer.getId(), System.currentTimeMillis()); } @@ -87,7 +89,7 @@ public class ABLMediaServerStatusManger { if (serverItem == null) { return; } - logger.info("[ABL-HOOK事件-服务启动] ID:" + event.getMediaServerItem().getId()); + log.info("[ABL-HOOK事件-服务启动] ID:" + event.getMediaServerItem().getId()); online(serverItem, null); } @@ -101,7 +103,7 @@ public class ABLMediaServerStatusManger { if (serverItem == null) { return; } - logger.info("[ABL-HOOK事件-心跳] ID:" + event.getMediaServerItem().getId()); + log.info("[ABL-HOOK事件-心跳] ID:" + event.getMediaServerItem().getId()); online(serverItem, null); } @@ -111,7 +113,7 @@ public class ABLMediaServerStatusManger { if (event.getMediaServer() == null) { return; } - logger.info("[ABL-节点被移除] ID:" + event.getMediaServer().getServerId()); + log.info("[ABL-节点被移除] ID:" + event.getMediaServer().getServerId()); offlineABLPrimaryMap.remove(event.getMediaServer().getServerId()); offlineAblsecondaryMap.remove(event.getMediaServer().getServerId()); offlineAblTimeMap.remove(event.getMediaServer().getServerId()); @@ -130,17 +132,17 @@ public class ABLMediaServerStatusManger { offlineABLPrimaryMap.remove(mediaServerItem.getId()); continue; } - logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem); AblServerConfig ablServerConfig = null; if (ablResult.getCode() != 0) { - logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); continue; } JSONArray params = ablResult.getParams(); if (params == null || params.isEmpty()) { - logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); }else { ablServerConfig = AblServerConfig.getInstance(params); initPort(mediaServerItem, ablServerConfig); @@ -153,17 +155,17 @@ public class ABLMediaServerStatusManger { if (offlineAblTimeMap.get(mediaServerItem.getId()) < System.currentTimeMillis() - 30*60*1000) { continue; } - logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem); AblServerConfig ablServerConfig = null; if (ablResult.getCode() != 0) { - logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); continue; } JSONArray params = ablResult.getParams(); if (params == null || params.isEmpty()) { - logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + log.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); }else { ablServerConfig = AblServerConfig.getInstance(params); @@ -175,33 +177,30 @@ public class ABLMediaServerStatusManger { } private void online(MediaServer mediaServer, AblServerConfig config) { + if (config == null) { + ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServer); + JSONArray data = ablResult.getParams(); + if (data != null && !data.isEmpty()) { + config = AblServerConfig.getInstance(data); + }else { + log.info("[ABL-连接成功] 读取流媒体配置失败 ID:{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); + return; + } + } offlineABLPrimaryMap.remove(mediaServer.getId()); offlineAblsecondaryMap.remove(mediaServer.getId()); offlineAblTimeMap.remove(mediaServer.getId()); - if (!mediaServer.isStatus()) { - logger.info("[ABL-连接成功] ID:{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); - mediaServer.setStatus(true); - mediaServer.setHookAliveInterval(10F); - mediaServerService.update(mediaServer); - if(mediaServer.isAutoConfig()) { - if (config == null) { - ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServer); - JSONArray data = ablResult.getParams(); - if (data != null && !data.isEmpty()) { - config = AblServerConfig.getInstance(data); - } - } - if (config != null) { - initPort(mediaServer, config); - setAblConfig(mediaServer, false, config); - } - } - mediaServerService.update(mediaServer); - } + log.info("[ABL-连接成功] ID:{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); + mediaServer.setStatus(true); + mediaServer.setHookAliveInterval(10F); + initPort(mediaServer, config); + // 发送上线通知 + eventPublisher.mediaServerOnlineEventPublish(mediaServer); + mediaServerService.update(mediaServer); // 设置两次心跳未收到则认为zlm离线 String key = "ABL-keepalive-" + mediaServer.getId(); dynamicTask.startDelay(key, ()->{ - logger.warn("[ABL-心跳超时] ID:{}", mediaServer.getId()); + log.warn("[ABL-心跳超时] ID:{}", mediaServer.getId()); mediaServer.setStatus(false); offlineABLPrimaryMap.put(mediaServer.getId(), mediaServer); offlineAblTimeMap.put(mediaServer.getId(), System.currentTimeMillis()); @@ -238,16 +237,16 @@ public class ABLMediaServerStatusManger { public void setAblConfig(MediaServer mediaServerItem, boolean restart, AblServerConfig config) { try { if (config.getHookEnable() == 0) { - logger.info("[媒体服务节点-ABL] 开启HOOK功能 :{}", mediaServerItem.getId()); + log.info("[媒体服务节点-ABL] 开启HOOK功能 :{}", mediaServerItem.getId()); ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, "hook_enable", "1"); if (ablResult.getCode() == 0) { - logger.info("[媒体服务节点-ABL] 开启HOOK功能成功 :{}", mediaServerItem.getId()); + log.info("[媒体服务节点-ABL] 开启HOOK功能成功 :{}", mediaServerItem.getId()); }else { - logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}->{}", mediaServerItem.getId(), ablResult.getMemo()); + log.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}->{}", mediaServerItem.getId(), ablResult.getMemo()); } } }catch (Exception e) { - logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}", mediaServerItem.getId(), e); + log.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}", mediaServerItem.getId(), e); } // 设置相关的HOOK String[] hookUrlArray = { @@ -280,16 +279,16 @@ public class ABLMediaServerStatusManger { if (!hookUrl.equals(field.get(config))) { ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, hook, hookUrl); if (ablResult.getCode() == 0) { - logger.info("[媒体服务节点-ABL] 设置HOOK {} 成功 :{}", hook, mediaServerItem.getId()); + log.info("[媒体服务节点-ABL] 设置HOOK {} 成功 :{}", hook, mediaServerItem.getId()); }else { - logger.info("[媒体服务节点-ABL] 设置HOOK {} 失败 :{}->{}", hook, mediaServerItem.getId(), ablResult.getMemo()); + log.info("[媒体服务节点-ABL] 设置HOOK {} 失败 :{}->{}", hook, mediaServerItem.getId(), ablResult.getMemo()); } } } } } }catch (Exception e) { - logger.info("[媒体服务节点-ABL] 设置HOOK 失败 :{}", mediaServerItem.getId(), e); + log.info("[媒体服务节点-ABL] 设置HOOK 失败 :{}", mediaServerItem.getId(), e); } } @@ -342,15 +341,15 @@ public class ABLMediaServerStatusManger { // // if (responseJSON != null && responseJSON.getInteger("code") == 0) { // if (restart) { -// logger.info("[媒体服务节点] 设置成功,开始重启以保证配置生效 {} -> {}:{}", +// log.info("[媒体服务节点] 设置成功,开始重启以保证配置生效 {} -> {}:{}", // mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); // ablResTfulUtils.restartServer(mediaServerItem); // }else { -// logger.info("[媒体服务节点] 设置成功 {} -> {}:{}", +// log.info("[媒体服务节点] 设置成功 {} -> {}:{}", // mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); // } // }else { -// logger.info("[媒体服务节点] 设置媒体服务节点失败 {} -> {}:{}", +// log.info("[媒体服务节点] 设置媒体服务节点失败 {} -> {}:{}", // mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); // } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java index 5873ca7dd..7b6fe6114 100755 --- a/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java @@ -22,7 +22,7 @@ public interface IMediaServerService { List getAll(); - List getAllFromDatabase(); + List getAllFromDatabaseWithOutDefault(); List getAllOnline(); @@ -175,4 +175,7 @@ public interface IMediaServerService { DownloadFileInfo getDownloadFilePath(MediaServer mediaServer, RecordInfo recordInfo); void loadMP4File(MediaServer mediaServer, String app, String stream, String filePath, String fileName, ErrorCallback callback); + + void deleteDefault(); + } 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 19a9b23ba..41f841f86 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 @@ -340,7 +340,12 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public void update(MediaServer mediaSerItem) { - mediaServerMapper.update(mediaSerItem); + if (mediaServerMapper.queryOne(mediaSerItem.getId(), userSetting.getServerId()) != null) { + mediaServerMapper.update(mediaSerItem); + }else { + mediaServerMapper.add(mediaSerItem); + } + MediaServer mediaServerInRedis = getOne(mediaSerItem.getId()); // 获取完整数据 MediaServer mediaServerInDataBase = mediaServerMapper.queryOne(mediaSerItem.getId(), userSetting.getServerId()); @@ -409,8 +414,8 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override - public List getAllFromDatabase() { - return mediaServerMapper.queryAll(userSetting.getServerId()); + public List getAllFromDatabaseWithOutDefault() { + return mediaServerMapper.queryAllWithOutDefault(userSetting.getServerId()); } @Override @@ -441,7 +446,15 @@ public class MediaServerServiceImpl implements IMediaServerService { return null; } String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId(); - return (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId); + MediaServer mediaServer = (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId); + if (mediaServer == null) { + // 尝试从数据库获取 + mediaServer = mediaServerMapper.queryOne(mediaServerId, userSetting.getServerId()); + if (mediaServer != null) { + redisTemplate.opsForHash().put(key, mediaServer.getId(), mediaServer); + } + } + return mediaServer; } /** @@ -992,6 +1005,11 @@ public class MediaServerServiceImpl implements IMediaServerService { mediaNodeServerService.loadMP4File(mediaServer, app, stream, filePath, fileName, callback); } + @Override + public void deleteDefault() { + mediaServerMapper.deleteDefault(userSetting.getServerId()); + } + @Override public void seekRecordStamp(MediaServer mediaServer, String app, String stream, Double stamp, String schema) { IMediaNodeServerService mediaNodeServerService = nodeServerServiceMap.get(mediaServer.getType()); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 76f1e7419..c6c7d5426 100755 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.zlm; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.bean.ResultForOnPublish; @@ -26,6 +27,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * @description:针对 ZLMediaServer的hook事件监听 @@ -44,6 +46,9 @@ public class ZLMHttpHookListener { @Autowired private IMediaService mediaService; + @Autowired + private MediaConfig mediaConfig; + @Autowired private UserSetting userSetting; @@ -226,13 +231,19 @@ public class ZLMHttpHookListener { jsonObject.put("ip", request.getRemoteAddr()); ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject); zlmServerConfig.setIp(request.getRemoteAddr()); - log.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId()); + log.info("[ZLM HOOK] zlm 启动 {}", zlmServerConfig.getGeneralMediaServerId()); try { HookZlmServerStartEvent event = new HookZlmServerStartEvent(this); - MediaServer mediaServerItem = mediaServerService.getOne(zlmServerConfig.getMediaServerId()); - if (mediaServerItem != null) { - event.setMediaServerItem(mediaServerItem); + MediaServer mediaServer = mediaServerService.getOne(zlmServerConfig.getMediaServerId()); + if (mediaServer == null && Objects.equals(mediaConfig.getId(), zlmServerConfig.getGeneralMediaServerId())) { + mediaServer = mediaConfig.buildMediaSer(); + } + if (mediaServer != null) { + event.setMediaServer(mediaServer); + event.setConfig(zlmServerConfig); applicationEventPublisher.publishEvent(event); + }else { + log.info("[ZLM HOOK] 此zlm未接入 {}", zlmServerConfig.getGeneralMediaServerId()); } }catch (Exception e) { log.info("[ZLM-HOOK-ZLM启动] 发送通知失败 ", e); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManager.java index 0281ffe45..a5f2a9507 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManager.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaServerStatusManager.java @@ -73,7 +73,7 @@ public class ZLMMediaServerStatusManager { if (!type.equals(mediaServerItem.getType())) { continue; } - log.info("[ZLM-添加待上线节点] ID:" + mediaServerItem.getId()); + log.info("[ZLM-添加待上线节点] ID:{}", mediaServerItem.getId()); offlineZlmPrimaryMap.put(mediaServerItem.getId(), mediaServerItem); offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); execute(); @@ -83,17 +83,13 @@ public class ZLMMediaServerStatusManager { @Async("taskExecutor") @EventListener public void onApplicationEvent(HookZlmServerStartEvent event) { - if (event.getMediaServerItem() == null - || !type.equals(event.getMediaServerItem().getType()) - || event.getMediaServerItem().isStatus()) { + if (event.getMediaServer() == null + || !type.equals(event.getMediaServer().getType()) + || event.getMediaServer().isStatus()) { return; } - MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId()); - if (serverItem == null) { - return; - } - log.info("[ZLM-HOOK事件-服务启动] ID:" + event.getMediaServerItem().getId()); - online(serverItem, null); + log.info("[ZLM-HOOK事件-服务启动] ID:{}", event.getMediaServer().getId()); + online(event.getMediaServer(), event.getConfig()); } @Async("taskExecutor") @@ -102,12 +98,12 @@ public class ZLMMediaServerStatusManager { if (event.getMediaServerItem() == null) { return; } - MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId()); - if (serverItem == null) { + MediaServer mediaServer = mediaServerService.getOne(event.getMediaServerItem().getId()); + if (mediaServer == null) { return; } - log.debug("[ZLM-HOOK事件-心跳] ID:" + event.getMediaServerItem().getId()); - online(serverItem, null); + log.debug("[ZLM-HOOK事件-心跳] ID:{}", event.getMediaServerItem().getId()); + online(mediaServer, null); } @Async("taskExecutor") @@ -179,70 +175,49 @@ public class ZLMMediaServerStatusManager { } } - private void online(MediaServer mediaServerItem, ZLMServerConfig config) { - offlineZlmPrimaryMap.remove(mediaServerItem.getId()); - offlineZlmsecondaryMap.remove(mediaServerItem.getId()); - offlineZlmTimeMap.remove(mediaServerItem.getId()); - if (!mediaServerItem.isStatus()) { - log.info("[ZLM-连接成功] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); - mediaServerItem.setStatus(true); - mediaServerItem.setHookAliveInterval(10F); - // 发送上线通知 - eventPublisher.mediaServerOnlineEventPublish(mediaServerItem); - if(mediaServerItem.isAutoConfig()) { - if (config == null) { - ZLMResult> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); - List data = mediaServerConfig.getData(); - if (data != null && !data.isEmpty()) { - config = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); - } - } - if (config != null) { - initPort(mediaServerItem, config); - setZLMConfig(mediaServerItem, "0".equals(config.getHookEnable()) - || !Objects.equals(mediaServerItem.getHookAliveInterval(), config.getHookAliveInterval())); - } + private void online(MediaServer mediaServer, ZLMServerConfig config) { + if (config == null) { + ZLMResult> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServer); + List data = mediaServerConfig.getData(); + if (data != null && !data.isEmpty()) { + config = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); + }else { + log.info("[ZLM-连接成功] 读取流媒体配置失败 ID:{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); + return; } - mediaServerService.update(mediaServerItem); } + offlineZlmPrimaryMap.remove(mediaServer.getId()); + offlineZlmsecondaryMap.remove(mediaServer.getId()); + offlineZlmTimeMap.remove(mediaServer.getId()); + mediaServer.setStatus(true); + mediaServer.setHookAliveInterval(config.getHookAliveInterval()); + initPort(mediaServer, config); + log.info("[ZLM-连接成功] ID:{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort()); + // 发送上线通知 + eventPublisher.mediaServerOnlineEventPublish(mediaServer); + mediaServerService.update(mediaServer); // 设置两次心跳未收到则认为zlm离线 - String key = "zlm-keepalive-" + mediaServerItem.getId(); + String key = "zlm-keepalive-" + mediaServer.getId(); dynamicTask.startDelay(key, ()->{ - log.warn("[ZLM-心跳超时] ID:{}", mediaServerItem.getId()); - mediaServerItem.setStatus(false); - offlineZlmPrimaryMap.put(mediaServerItem.getId(), mediaServerItem); - offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); + log.warn("[ZLM-心跳超时] ID:{}", mediaServer.getId()); + mediaServer.setStatus(false); + offlineZlmPrimaryMap.put(mediaServer.getId(), mediaServer); + offlineZlmTimeMap.put(mediaServer.getId(), System.currentTimeMillis()); // 发送离线通知 - eventPublisher.mediaServerOfflineEventPublish(mediaServerItem); - mediaServerService.update(mediaServerItem); - }, (int)(mediaServerItem.getHookAliveInterval() * 2 * 1000)); + eventPublisher.mediaServerOfflineEventPublish(mediaServer); + mediaServerService.update(mediaServer); + }, (int)(mediaServer.getHookAliveInterval() * 2 * 1000)); } private void initPort(MediaServer 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()); - } - if (mediaServerItem.getFlvSSLPort() == 0) { - mediaServerItem.setFlvSSLPort(zlmServerConfig.getHttpSSLport()); - } - if (mediaServerItem.getWsFlvSSLPort() == 0) { - mediaServerItem.setWsFlvSSLPort(zlmServerConfig.getHttpSSLport()); - } + mediaServerItem.setHttpSSlPort(zlmServerConfig.getHttpSSLport()); + mediaServerItem.setRtmpPort(zlmServerConfig.getRtmpPort()); + mediaServerItem.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort()); + mediaServerItem.setRtspPort(zlmServerConfig.getRtspPort()); + mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport()); + mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort()); + mediaServerItem.setFlvSSLPort(zlmServerConfig.getHttpSSLport()); + mediaServerItem.setWsFlvSSLPort(zlmServerConfig.getHttpSSLport()); if (Objects.isNull(zlmServerConfig.getTranscodeSuffix())) { mediaServerItem.setTranscodeSuffix(null); }else { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerStartEvent.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerStartEvent.java index e1c28b1d1..50239ff25 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerStartEvent.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerStartEvent.java @@ -1,24 +1,23 @@ package com.genersoft.iot.vmp.media.zlm.event; import com.genersoft.iot.vmp.media.bean.MediaServer; +import com.genersoft.iot.vmp.media.zlm.dto.ZLMServerConfig; +import lombok.Getter; +import lombok.Setter; import org.springframework.context.ApplicationEvent; /** * zlm server_start事件 */ +@Setter +@Getter public class HookZlmServerStartEvent extends ApplicationEvent { public HookZlmServerStartEvent(Object source) { super(source); } - private MediaServer mediaServerItem; + private MediaServer mediaServer; + private ZLMServerConfig config; - public MediaServer getMediaServerItem() { - return mediaServerItem; - } - - public void setMediaServerItem(MediaServer mediaServerItem) { - this.mediaServerItem = mediaServerItem; - } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java index f892be273..f063bf341 100755 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java @@ -86,34 +86,15 @@ public interface MediaServerMapper { @Update(value = {" "}) int update(MediaServer mediaServerItem); @@ -159,6 +140,9 @@ public interface MediaServerMapper { @Select("SELECT * FROM wvp_media_server where server_id = #{serverId}") List queryAll(@Param("serverId") String serverId); + @Select("SELECT * FROM wvp_media_server where default_server=false AND server_id = #{serverId}") + List queryAllWithOutDefault(@Param("serverId") String serverId); + @Delete("DELETE FROM wvp_media_server WHERE id=#{id} and server_id = #{serverId}") void delOne(String id, @Param("serverId") String serverId); @@ -171,4 +155,6 @@ public interface MediaServerMapper { @Select("SELECT * FROM wvp_media_server WHERE record_assist_port > 0 and server_id = #{serverId}") List queryAllWithAssistPort(@Param("serverId") String serverId); + @Delete("DELETE FROM wvp_media_server WHERE default_server=true and server_id = #{serverId}") + void deleteDefault(@Param("serverId") String serverId); }