From a42dda2bd3cc1cf8c20cc61e7ad9211eadecbaf3 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期四, 24 二月 2022 16:55:06 +0800 Subject: [PATCH] 规范数据库,添加必要约束,优化通道批量导入功能 --- src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 103 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index 7d9f748..507d4e6 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -14,8 +14,11 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; 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.service.IStreamProxyService; import com.genersoft.iot.vmp.service.bean.SSRCInfo; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.storager.dao.MediaServerMapper; import com.genersoft.iot.vmp.utils.redis.JedisUtil; import com.genersoft.iot.vmp.utils.redis.RedisUtil; @@ -27,7 +30,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; import org.springframework.util.StringUtils; import java.text.ParseException; @@ -62,6 +69,12 @@ private MediaServerMapper mediaServerMapper; @Autowired + DataSourceTransactionManager dataSourceTransactionManager; + + @Autowired + TransactionDefinition transactionDefinition; + + @Autowired private VideoStreamSessionManager streamSession; @Autowired @@ -69,6 +82,12 @@ @Autowired private RedisUtil redisUtil; + + @Autowired + private IVideoManagerStorager storager; + + @Autowired + private IStreamProxyService streamProxyService; @Autowired private EventPublisher publisher; @@ -83,7 +102,7 @@ */ @Override public void run(String... args) throws Exception { - logger.info("Media Server 缂撳瓨鍒濆鍖�"); + logger.info("[缂撳瓨鍒濆鍖朷 Media Server "); List<MediaServerItem> mediaServerItemList = mediaServerMapper.queryAll(); for (MediaServerItem mediaServerItem : mediaServerItemList) { if (StringUtils.isEmpty(mediaServerItem.getId())) { @@ -231,6 +250,7 @@ public List<MediaServerItem> getAllOnline() { String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); Set<String> mediaServerIdSet = redisUtil.zRevRange(key, 0, -1); + List<MediaServerItem> result = new ArrayList<>(); if (mediaServerIdSet != null && mediaServerIdSet.size() > 0) { for (String mediaServerId : mediaServerIdSet) { @@ -238,6 +258,7 @@ result.add((MediaServerItem) redisUtil.get(serverKey)); } } + Collections.reverse(result); return result; } @@ -253,11 +274,6 @@ } String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerId; return (MediaServerItem)redisUtil.get(key); - } - - @Override - public MediaServerItem getOneByHostAndPort(String host, int port) { - return mediaServerMapper.queryOneByHostAndPort(host, port); } @Override @@ -312,7 +328,22 @@ @Override public int updateToDatabase(MediaServerItem mediaSerItem) { - return mediaServerMapper.update(mediaSerItem); + int result = 0; + if (mediaSerItem.isDefaultServer()) { + TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); + int delResult = mediaServerMapper.delDefault(); + if (delResult == 0) { + logger.error("绉婚櫎鏁版嵁搴撻粯璁lm鑺傜偣澶辫触"); + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return 0; + } + result = mediaServerMapper.add(mediaSerItem); + dataSourceTransactionManager.commit(transactionStatus); //鎵嬪姩鎻愪氦 + }else { + result = mediaServerMapper.update(mediaSerItem); + } + return result; } /** @@ -321,15 +352,13 @@ */ @Override public void zlmServerOnline(ZLMServerConfig zlmServerConfig) { - logger.info("[ ZLM锛歿} ]-[ {}:{} ]宸茶繛鎺�", + logger.info("[ ZLM锛歿} ]-[ {}:{} ]姝e湪杩炴帴", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); MediaServerItem serverItem = mediaServerMapper.queryOne(zlmServerConfig.getGeneralMediaServerId()); if (serverItem == null) { - serverItem = mediaServerMapper.queryOneByHostAndPort(zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); - } - if (serverItem == null) { - logger.warn("[鏈敞鍐岀殑zlm] 鎷掓帴鎺ュ叆锛氭潵鑷獅}锛歿}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + logger.warn("[鏈敞鍐岀殑zlm] 鎷掓帴鎺ュ叆锛歿}鏉ヨ嚜{}锛歿}", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + logger.warn("璇锋鏌LM鐨�<general.mediaServerId>閰嶇疆鏄惁涓嶹VP鐨�<media.id>涓�鑷�"); return; } serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval()); @@ -357,11 +386,10 @@ serverItem.setStatus(true); if (StringUtils.isEmpty(serverItem.getId())) { - serverItem.setId(zlmServerConfig.getGeneralMediaServerId()); - mediaServerMapper.updateByHostAndPort(serverItem); - }else { - mediaServerMapper.update(serverItem); + logger.warn("[鏈敞鍐岀殑zlm] serverItem缂哄皯ID锛� 鏃犳硶鎺ュ叆锛歿}锛歿}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + return; } + mediaServerMapper.update(serverItem); String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId(); if (redisUtil.get(key) == null) { SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain()); @@ -373,9 +401,11 @@ redisUtil.set(key, serverItem); resetOnlineServerItem(serverItem); updateMediaServerKeepalive(serverItem.getId(), null); - setZLMConfig(serverItem); - publisher.zlmOnlineEventPublish(serverItem.getId()); + setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable())); + publisher.zlmOnlineEventPublish(serverItem.getId()); + logger.info("[ ZLM锛歿} ]-[ {}:{} ]杩炴帴鎴愬姛", + zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); } @@ -448,10 +478,11 @@ /** * 瀵箊lm鏈嶅姟鍣ㄨ繘琛屽熀纭�閰嶇疆 * @param mediaServerItem 鏈嶅姟ID + * @param restart 鏄惁閲嶅惎zlm */ @Override - public void setZLMConfig(MediaServerItem mediaServerItem) { - logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm", + public void setZLMConfig(MediaServerItem mediaServerItem, boolean restart) { + logger.info("[ ZLM锛歿} ]-[ {}:{} ]姝e湪璁剧疆zlm", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); String protocol = sslEnabled ? "https" : "http"; String hookPrex = String.format("%s://%s:%s/index/hook", protocol, mediaServerItem.getHookIp(), serverPort); @@ -483,12 +514,22 @@ JSONObject responseJSON = zlmresTfulUtils.setServerConfig(mediaServerItem, param); if (responseJSON != null && responseJSON.getInteger("code") == 0) { - logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm鎴愬姛", - mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + if (restart) { + logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm鎴愬姛, 寮�濮嬮噸鍚互淇濊瘉閰嶇疆鐢熸晥", + mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + zlmresTfulUtils.restartServer(mediaServerItem); + }else { + logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm鎴愬姛", + mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); + } + + }else { logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm澶辫触", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); } + + } @@ -565,7 +606,6 @@ redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(), id); String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + id; redisUtil.del(key); - mediaServerMapper.delOne(id); } @Override @@ -579,4 +619,21 @@ int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2; redisUtil.set(key, data, hookAliveInterval); } + + @Override + public void syncCatchFromDatabase() { + List<MediaServerItem> allInCatch = getAll(); + List<MediaServerItem> allInDatabase = mediaServerMapper.queryAll(); + Map<String, MediaServerItem> mediaServerItemMap = new HashMap<>(); + + for (MediaServerItem mediaServerItem : allInDatabase) { + mediaServerItemMap.put(mediaServerItem.getId(), mediaServerItem); + } + for (MediaServerItem mediaServerItem : allInCatch) { + if (mediaServerItemMap.get(mediaServerItem) == null) { + delete(mediaServerItem.getId()); + } + } + } + } -- Gitblit v1.8.0