Commit 7ecc86b33d37df8ecda167ca390e932df1442171
1 parent
28df05e2
zlm关闭一段时间后,重启后信令服务不重连zlm
Showing
2 changed files
with
57 additions
and
7 deletions
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 | } |