| 
					
				 | 
			
			
				@@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.DynamicTask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.conf.UserSetting; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.conf.exception.ControllerException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.genersoft.iot.vmp.gb28181.service.IGbChannelService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.bean.MediaInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.bean.MediaServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.event.hook.Hook; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -16,6 +17,8 @@ import com.genersoft.iot.vmp.media.event.hook.HookType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.event.media.MediaNotFoundEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOfflineEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerOnlineEvent; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.media.service.IMediaServerService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.streamProxy.bean.StreamProxy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.genersoft.iot.vmp.service.IGbStreamService; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -42,6 +45,7 @@ import org.springframework.scheduling.annotation.Scheduled; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.TransactionDefinition; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.TransactionStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.util.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.util.ObjectUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -73,7 +77,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private UserSetting userSetting; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private GbStreamMapper gbStreamMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private IGbChannelService gbChannelService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private PlatformGbStreamMapper platformGbStreamMapper; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -119,7 +123,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 流离开的处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 流未找到的处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Async("taskExecutor") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @EventListener 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -134,9 +138,29 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 流媒体节点上线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Async("taskExecutor") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @EventListener 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void onApplicationEvent(MediaServerOnlineEvent event) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        zlmServerOnline(event.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 流媒体节点离线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Async("taskExecutor") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @EventListener 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void onApplicationEvent(MediaServerOfflineEvent event) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        zlmServerOffline(event.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public void save(StreamProxy streamProxy, GeneralCallback<StreamInfo> callback) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public StreamInfo save(StreamProxy streamProxy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         MediaServer mediaServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (ObjectUtils.isEmpty(streamProxy.getMediaServerId()) || "auto".equals(streamProxy.getMediaServerId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mediaServer = mediaServerService.getMediaServerForMinimumLoad(null); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,136 +181,47 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             saveResult = addStreamProxy(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!saveResult) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            callback.run(ErrorCode.ERROR100.getCode(), "保存失败", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR100.getCode(), "保存失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (streamProxy.isEnable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            StreamInfo streamInfo = mediaServerService.startProxy(mediaServer, streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (streamInfo != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                callback.run(ErrorCode.ERROR100.getCode(), "记录已保存,启用失败", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            Hook hook = Hook.getInstance(HookType.on_media_arrival, streamProxy.getApp(), streamProxy.getStream(), mediaServer.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            hookSubscribe.addSubscribe(hook, (hookData) -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        mediaServer, streamProxy.getApp(), streamProxy.getStream(), null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            String talkKey = UUID.randomUUID().toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            String delayTalkKey = UUID.randomUUID().toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            dynamicTask.startDelay(delayTalkKey, ()->{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(streamProxy.getApp(), streamProxy.getStream(), mediaServer.getId(), false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                if (streamInfo != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    dynamicTask.stop(talkKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    callback.run(ErrorCode.ERROR100.getCode(), "超时", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            }, 7000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            WVPResult<String> result = addStreamProxyToZlm(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            if (result != null && result.getCode() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                hookSubscribe.removeSubscribe(hook); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                dynamicTask.stop(talkKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        mediaServer, streamProxy.getApp(), streamProxy.getStream(), null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                streamProxy.setEnable(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                // 直接移除 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                if (streamProxy.isEnableRemoveNoneReader()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    del(streamProxy.getApp(), streamProxy.getStream()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    updateStreamProxy(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                if (result == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    callback.run(ErrorCode.ERROR100.getCode(), "记录已保存,启用失败", null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    callback.run(ErrorCode.ERROR100.getCode(), result.getMsg(), null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    mediaServer, streamProxy.getApp(), streamProxy.getStream(), null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return mediaServerService.startProxy(mediaServer, streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 新增代理流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @param streamProxyItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private boolean addStreamProxy(StreamProxy streamProxyItem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        streamProxyItem.setStreamType("proxy"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        streamProxyItem.setStatus(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean addStreamProxy(StreamProxy streamProxy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String now = DateUtil.getNow(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        streamProxyItem.setCreateTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (streamProxyMapper.add(streamProxyItem) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!ObjectUtils.isEmpty(streamProxyItem.getGbId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (gbStreamMapper.add(streamProxyItem) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataSourceTransactionManager.commit(transactionStatus);     //手动提交 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("向数据库添加流代理失败:", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        streamProxy.setCreateTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        streamProxy.setUpdateTime(now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (streamProxyMapper.add(streamProxy) > 0 && !ObjectUtils.isEmpty(streamProxy.getGbDeviceId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            gbChannelService.add(streamProxy.getCommonGBChannel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 更新代理流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @param streamProxyItem 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean updateStreamProxy(StreamProxy streamProxyItem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        streamProxyItem.setStreamType("proxy"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (streamProxyMapper.update(streamProxyItem) > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!ObjectUtils.isEmpty(streamProxyItem.getGbId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (gbStreamMapper.updateByAppAndStream(streamProxyItem) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                //事务回滚 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean updateStreamProxy(StreamProxy streamProxy) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        streamProxy.setUpdateTime(DateUtil.getNow()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataSourceTransactionManager.commit(transactionStatus);     //手动提交 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            log.error("未处理的异常 ", e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            dataSourceTransactionManager.rollback(transactionStatus); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (streamProxyMapper.update(streamProxy) > 0 && !ObjectUtils.isEmpty(streamProxy.getGbDeviceId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (streamProxy.getGbId() > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                gbChannelService.update(streamProxy.getCommonGBChannel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                gbChannelService.add(streamProxy.getCommonGBChannel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -314,8 +249,8 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     param.getTimeoutMs(), param.isEnableAudio(), param.isEnableMp4(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     param.getFfmpegCmdKey()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            result = mediaServerService.addStreamProxy(mediaServer, param.getApp(), param.getStream(), param.getUrl().trim(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    param.isEnableAudio(), param.isEnableMp4(), param.getRtpType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result = mediaServerService.addStreamProxy(mediaServer, param.getApp(), param.getStream(), param.getSrcUrl().trim(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    param.isEnableAudio(), param.isEnableMp4(), param.getRtspType(), param.getTimeout()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (result != null && result.getCode() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String key = result.getData(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -381,39 +316,42 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public boolean start(String app, String stream) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         StreamProxy streamProxy = streamProxyMapper.selectOne(app, stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (streamProxy != null && !streamProxy.isEnable() ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            WVPResult<String> wvpResult = addStreamProxyToZlm(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (wvpResult == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (wvpResult.getCode() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                streamProxy.setEnable(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                updateStreamProxy(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                log.info("启用代理失败: {}/{}->{}({})", app, stream, wvpResult.getMsg(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        streamProxy.getSrcUrl() == null? streamProxy.getUrl():streamProxy.getSrcUrl()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else if (streamProxy != null && streamProxy.isEnable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           return true ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (streamProxy == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR404.getCode(), "代理信息未找到"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MediaServer mediaServer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (ObjectUtils.isEmpty(streamProxy.getMediaServerId()) || "auto".equals(streamProxy.getMediaServerId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mediaServer = mediaServerService.getMediaServerForMinimumLoad(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mediaServer = mediaServerService.getOne(streamProxy.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (mediaServer == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.warn("[启用代理] 未找到可用的媒体节点"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的媒体节点"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StreamInfo streamInfo = mediaServerService.startProxy(mediaServer, streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (streamInfo == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.warn("[启用代理] 失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR100.getCode(), "失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!streamProxy.isEnable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            updateStreamProxy(streamProxy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public boolean stop(String app, String stream) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        boolean result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        StreamProxy streamProxyDto = streamProxyMapper.selectOne(app, stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (streamProxyDto != null && streamProxyDto.isEnable()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Boolean removed = removeStreamProxyFromZlm(streamProxyDto); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (removed != null && removed) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                streamProxyDto.setEnable(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                result = updateStreamProxy(streamProxyDto); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void stop(String app, String stream) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StreamProxy streamProxy = streamProxyMapper.selectOne(app, stream); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (streamProxy == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR404.getCode(), "代理信息未找到"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MediaServer mediaServer = mediaServerService.getOne(streamProxy.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (mediaServer == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到启用时使用的媒体节点"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mediaServerService.stopProxy(mediaServer, streamProxy.getStreamKey()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -430,10 +368,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void zlmServerOnline(String mediaServerId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 移除开启了无人观看自动移除的流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<StreamProxy> streamProxyItemList = streamProxyMapper.selectAutoRemoveItemByMediaServerId(mediaServerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (streamProxyItemList.size() > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            gbStreamMapper.batchDel(streamProxyItemList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<StreamProxy> streamProxyItemList = streamProxyMapper.selectWithAutoRemoveAndWithoutGbDeviceIdByMediaServerId(mediaServerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 移除拉流代理生成的流信息 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -540,40 +475,40 @@ public class StreamProxyServiceImpl implements IStreamProxyService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Scheduled(cron = "* 0/10 * * * ?") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public void asyncCheckStreamProxyStatus() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<MediaServer> all = mediaServerService.getAllOnline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (CollectionUtils.isEmpty(all)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String, MediaServer> serverItemMap = all.stream().collect(Collectors.toMap(MediaServer::getId, Function.identity(), (m1, m2) -> m1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<StreamProxy> list = streamProxyMapper.selectForEnable(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (CollectionUtils.isEmpty(list)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for (StreamProxy streamProxyItem : list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            MediaServer mediaServerItem = serverItemMap.get(streamProxyItem.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServerItem, streamProxyItem.getApp(), streamProxyItem.getStream()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (mediaInfo == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                streamProxyItem.setStatus(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (mediaInfo.getOnline() != null && mediaInfo.getOnline()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    streamProxyItem.setStatus(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    streamProxyItem.setStatus(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            updateStreamProxy(streamProxyItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    @Scheduled(cron = "* 0/10 * * * ?") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    public void asyncCheckStreamProxyStatus() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        List<MediaServer> all = mediaServerService.getAllOnline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (CollectionUtils.isEmpty(all)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        Map<String, MediaServer> serverItemMap = all.stream().collect(Collectors.toMap(MediaServer::getId, Function.identity(), (m1, m2) -> m1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        List<StreamProxy> list = streamProxyMapper.selectForEnable(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (CollectionUtils.isEmpty(list)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        for (StreamProxy streamProxyItem : list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            MediaServer mediaServerItem = serverItemMap.get(streamProxyItem.getMediaServerId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServerItem, streamProxyItem.getApp(), streamProxyItem.getStream()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            if (mediaInfo == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                streamProxyItem.setStatus(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                if (mediaInfo.getOnline() != null && mediaInfo.getOnline()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    streamProxyItem.setStatus(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    streamProxyItem.setStatus(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            updateStreamProxy(streamProxyItem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |