|  | @@ -30,7 +30,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  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;
 | 
	
	
		
			
				|  | @@ -64,6 +68,12 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private MediaServerMapper mediaServerMapper;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    DataSourceTransactionManager dataSourceTransactionManager;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    TransactionDefinition transactionDefinition;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private VideoStreamSessionManager streamSession;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -266,11 +276,6 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |          return (MediaServerItem)redisUtil.get(key);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public MediaServerItem getOneByHostAndPort(String host, int port) {
 | 
	
		
			
				|  |  | -        return mediaServerMapper.queryOneByHostAndPort(host, port);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public MediaServerItem getDefaultMediaServer() {
 | 
	
		
			
				|  |  |          return mediaServerMapper.queryDefault();
 | 
	
	
		
			
				|  | @@ -323,7 +328,22 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @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("移除数据库默认zlm节点失败");
 | 
	
		
			
				|  |  | +                //事务回滚
 | 
	
		
			
				|  |  | +                dataSourceTransactionManager.rollback(transactionStatus);
 | 
	
		
			
				|  |  | +                return 0;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            result = mediaServerMapper.add(mediaSerItem);
 | 
	
		
			
				|  |  | +            dataSourceTransactionManager.commit(transactionStatus);     //手动提交
 | 
	
		
			
				|  |  | +        }else {
 | 
	
		
			
				|  |  | +            result = mediaServerMapper.update(mediaSerItem);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return result;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -332,15 +352,13 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public void zlmServerOnline(ZLMServerConfig zlmServerConfig) {
 | 
	
		
			
				|  |  | -        logger.info("[ ZLM:{} ]-[ {}:{} ]已连接",
 | 
	
		
			
				|  |  | +        logger.info("[ ZLM:{} ]-[ {}:{} ]正在连接",
 | 
	
		
			
				|  |  |                  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("请检查ZLM的<general.mediaServerId>配置是否与WVP的<media.id>一致");
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval());
 | 
	
	
		
			
				|  | @@ -368,11 +386,10 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |          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());
 | 
	
	
		
			
				|  | @@ -387,7 +404,8 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |          setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          publisher.zlmOnlineEventPublish(serverItem.getId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        logger.info("[ ZLM:{} ]-[ {}:{} ]连接成功",
 | 
	
		
			
				|  |  | +                zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -464,7 +482,7 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public void setZLMConfig(MediaServerItem mediaServerItem, boolean restart) {
 | 
	
		
			
				|  |  | -        logger.info("[ ZLM:{} ]-[ {}:{} ]设置zlm",
 | 
	
		
			
				|  |  | +        logger.info("[ ZLM:{} ]-[ {}:{} ]正在设置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);
 | 
	
	
		
			
				|  | @@ -601,4 +619,21 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
 | 
	
		
			
				|  |  |          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());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |