Commit 7ecc86b33d37df8ecda167ca390e932df1442171

Authored by wym
1 parent 28df05e2

zlm关闭一段时间后,重启后信令服务不重连zlm

src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -8,6 +8,7 @@ import java.util.List; @@ -8,6 +8,7 @@ import java.util.List;
8 import java.util.Map; 8 import java.util.Map;
9 import java.util.Set; 9 import java.util.Set;
10 10
  11 +import com.genersoft.iot.vmp.media.zlm.ZLMRunner;
11 import org.slf4j.Logger; 12 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory; 13 import org.slf4j.LoggerFactory;
13 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +55,9 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -54,6 +55,9 @@ public class MediaServerServiceImpl implements IMediaServerService {
54 @Autowired 55 @Autowired
55 private SipConfig sipConfig; 56 private SipConfig sipConfig;
56 57
  58 + @Autowired
  59 + private ZLMRunner zlmRunner;
  60 +
57 @Value("${server.ssl.enabled:false}") 61 @Value("${server.ssl.enabled:false}")
58 private boolean sslEnabled; 62 private boolean sslEnabled;
59 63
@@ -279,7 +283,9 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -279,7 +283,9 @@ public class MediaServerServiceImpl implements IMediaServerService {
279 String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId; 283 String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
280 MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key); 284 MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key);
281 if(null==serverItem){ 285 if(null==serverItem){
282 - serverItem=mediaServerMapper.queryOne(mediaServerId); 286 + //zlm服务不在线,启动重连
  287 + reloadZlm();
  288 + serverItem=(MediaServerItem)redisUtil.get(key);
283 } 289 }
284 return serverItem; 290 return serverItem;
285 } 291 }
@@ -474,8 +480,13 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -474,8 +480,13 @@ public class MediaServerServiceImpl implements IMediaServerService {
474 String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); 480 String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
475 481
476 if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) { 482 if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) {
477 - logger.info("获取负载最低的节点时无在线节点");  
478 - return null; 483 + logger.info("获取负载最低的节点时无在线节点,启动重连机制");
  484 + //启动重连
  485 + reloadZlm();
  486 + if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) {
  487 + logger.info("获取负载最低的节点时无在线节点");
  488 + return null;
  489 + }
479 } 490 }
480 491
481 // 获取分数最低的,及并发最低的 492 // 获取分数最低的,及并发最低的
@@ -637,8 +648,14 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -637,8 +648,14 @@ public class MediaServerServiceImpl implements IMediaServerService {
637 MediaServerItem mediaServerItem = getOne(mediaServerId); 648 MediaServerItem mediaServerItem = getOne(mediaServerId);
638 if (mediaServerItem == null) { 649 if (mediaServerItem == null) {
639 // zlm连接重试 650 // zlm连接重试
640 - logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");  
641 - return; 651 + logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息,尝试重连zlm");
  652 + reloadZlm();
  653 + mediaServerItem = getOne(mediaServerId);
  654 + if (mediaServerItem == null) {
  655 + // zlm连接重试
  656 + logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");
  657 + return;
  658 + }
642 } 659 }
643 String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + mediaServerId; 660 String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
644 int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2; 661 int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2;
@@ -661,4 +678,12 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -661,4 +678,12 @@ public class MediaServerServiceImpl implements IMediaServerService {
661 } 678 }
662 } 679 }
663 680
  681 + public void reloadZlm(){
  682 + try {
  683 + zlmRunner.run();
  684 + Thread.sleep(500);//延迟0.5秒缓冲时间
  685 + } catch (Exception e) {
  686 + logger.warn("尝试重连zlm失败!",e);
  687 + }
  688 + }
664 } 689 }
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java
@@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.conf.security.dto.LoginUser; @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.conf.security.dto.LoginUser;
6 import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam; 6 import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam;
7 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; 7 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
8 import com.genersoft.iot.vmp.service.IMediaServerService; 8 import com.genersoft.iot.vmp.service.IMediaServerService;
  9 +import com.genersoft.iot.vmp.service.IStreamProxyService;
9 import com.genersoft.iot.vmp.service.IStreamPushService; 10 import com.genersoft.iot.vmp.service.IStreamPushService;
10 import com.genersoft.iot.vmp.service.IMediaService; 11 import com.genersoft.iot.vmp.service.IMediaService;
11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 12 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -37,6 +38,8 @@ public class MediaController { @@ -37,6 +38,8 @@ public class MediaController {
37 38
38 @Autowired 39 @Autowired
39 private IMediaService mediaService; 40 private IMediaService mediaService;
  41 + @Autowired
  42 + private IStreamProxyService streamProxyService;
40 43
41 44
42 /** 45 /**
@@ -95,8 +98,30 @@ public class MediaController { @@ -95,8 +98,30 @@ public class MediaController {
95 result.setMsg("scccess"); 98 result.setMsg("scccess");
96 result.setData(streamInfo); 99 result.setData(streamInfo);
97 }else { 100 }else {
98 - result.setCode(-1);  
99 - result.setMsg("fail"); 101 + //获取流失败,重启拉流后重试一次
  102 + streamProxyService.stop(app,stream);
  103 + boolean start = streamProxyService.start(app, stream);
  104 + try {
  105 + Thread.sleep(1000);
  106 + } catch (InterruptedException e) {
  107 + e.printStackTrace();
  108 + }
  109 + if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) {
  110 + String host = request.getHeader("Host");
  111 + String localAddr = host.split(":")[0];
  112 + logger.info("使用{}作为返回流的ip", localAddr);
  113 + streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, localAddr, authority);
  114 + }else {
  115 + streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority);
  116 + }
  117 + if (streamInfo != null){
  118 + result.setCode(0);
  119 + result.setMsg("scccess");
  120 + result.setData(streamInfo);
  121 + }else {
  122 + result.setCode(-1);
  123 + result.setMsg("fail");
  124 + }
100 } 125 }
101 return result; 126 return result;
102 } 127 }