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 8 import java.util.Map;
9 9 import java.util.Set;
10 10  
  11 +import com.genersoft.iot.vmp.media.zlm.ZLMRunner;
11 12 import org.slf4j.Logger;
12 13 import org.slf4j.LoggerFactory;
13 14 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -54,6 +55,9 @@ public class MediaServerServiceImpl implements IMediaServerService {
54 55 @Autowired
55 56 private SipConfig sipConfig;
56 57  
  58 + @Autowired
  59 + private ZLMRunner zlmRunner;
  60 +
57 61 @Value("${server.ssl.enabled:false}")
58 62 private boolean sslEnabled;
59 63  
... ... @@ -279,7 +283,9 @@ public class MediaServerServiceImpl implements IMediaServerService {
279 283 String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
280 284 MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key);
281 285 if(null==serverItem){
282   - serverItem=mediaServerMapper.queryOne(mediaServerId);
  286 + //zlm服务不在线,启动重连
  287 + reloadZlm();
  288 + serverItem=(MediaServerItem)redisUtil.get(key);
283 289 }
284 290 return serverItem;
285 291 }
... ... @@ -474,8 +480,13 @@ public class MediaServerServiceImpl implements IMediaServerService {
474 480 String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
475 481  
476 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 648 MediaServerItem mediaServerItem = getOne(mediaServerId);
638 649 if (mediaServerItem == null) {
639 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 660 String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
644 661 int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2;
... ... @@ -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 import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam;
7 7 import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
8 8 import com.genersoft.iot.vmp.service.IMediaServerService;
  9 +import com.genersoft.iot.vmp.service.IStreamProxyService;
9 10 import com.genersoft.iot.vmp.service.IStreamPushService;
10 11 import com.genersoft.iot.vmp.service.IMediaService;
11 12 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
... ... @@ -37,6 +38,8 @@ public class MediaController {
37 38  
38 39 @Autowired
39 40 private IMediaService mediaService;
  41 + @Autowired
  42 + private IStreamProxyService streamProxyService;
40 43  
41 44  
42 45 /**
... ... @@ -95,8 +98,30 @@ public class MediaController {
95 98 result.setMsg("scccess");
96 99 result.setData(streamInfo);
97 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 126 return result;
102 127 }
... ...