From 9b1af8ef1396de45884fe86c56844714045b82ec Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 07 十二月 2021 21:13:55 +0800 Subject: [PATCH] 适配zlm的hook保活 --- src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java | 15 ++ src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java | 3 src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java | 11 + src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java | 9 + src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 18 ++- src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java | 1 sql/mysql.sql | 1 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 7 + src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 93 ++++----------- src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java | 2 src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java | 1 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 14 ++ src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java | 11 + src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java | 16 ++ src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java | 2 src/main/resources/wvp.sqlite | 0 src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java | 10 + src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 1 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 4 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 1 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 4 src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java | 8 + src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java | 13 ++ src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java | 25 ++++ src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java | 5 src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 20 +++ src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java | 15 ++ 27 files changed, 223 insertions(+), 87 deletions(-) diff --git a/sql/mysql.sql b/sql/mysql.sql index 64fed12..50b70bc 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -148,6 +148,7 @@ defaultServer int not null, createTime varchar(50) not null, updateTime varchar(50) not null, + hookAliveInterval int not null, constraint media_server_i unique (ip, httpPort) ); diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index 3b47ff0..97cb3d9 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -10,10 +10,12 @@ public static final String WVP_SERVER_PREFIX = "VMP_SIGNALLING_SERVER_INFO_"; - public static final String WVP_SERVER_STREAM_PUSH_PREFIX = "VMP_SIGNALLING_STREAM_"; + public static final String WVP_SERVER_STREAM_PREFIX = "VMP_SIGNALLING_STREAM_"; public static final String MEDIA_SERVER_PREFIX = "VMP_MEDIA_SERVER_"; + public static final String MEDIA_SERVER_KEEPALIVE_PREFIX = "VMP_MEDIA_SERVER_KEEPALIVE_"; + public static final String MEDIA_SERVERS_ONLINE_PREFIX = "VMP_MEDIA_ONLINE_SERVERS_"; public static final String MEDIA_STREAM_PREFIX = "VMP_MEDIA_STREAM"; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java index 0c7ef88..2b52bcd 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java @@ -203,6 +203,7 @@ mediaServerItem.setRtpPortRange(rtpPortRange); mediaServerItem.setSendRtpPortRange(sendRtpPortRange); mediaServerItem.setRecordAssistPort(recordAssistPort); + mediaServerItem.setHookAliveInterval(120); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); mediaServerItem.setCreateTime(format.format(System.currentTimeMillis())); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java index 4c24d14..6fa802d 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java @@ -27,7 +27,7 @@ Integer keepaliveTimeOut = 255; - Integer registerTimeInterval = 60; + Integer registerTimeInterval = 120; private boolean alarm = false; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java index 33d6dd4..fd0cfdc 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java @@ -1,15 +1,16 @@ package com.genersoft.iot.vmp.gb28181.event; import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.event.offline.OfflineEvent; import com.genersoft.iot.vmp.gb28181.event.platformKeepaliveExpire.PlatformKeepaliveExpireEvent; import com.genersoft.iot.vmp.gb28181.event.platformNotRegister.PlatformNotRegisterEvent; +import com.genersoft.iot.vmp.media.zlm.event.ZLMOfflineEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; import com.genersoft.iot.vmp.gb28181.event.alarm.AlarmEvent; -import com.genersoft.iot.vmp.gb28181.event.offline.OfflineEvent; import com.genersoft.iot.vmp.gb28181.event.online.OnlineEvent; /** @@ -66,5 +67,11 @@ alarmEvent.setAlarmInfo(deviceAlarm); applicationEventPublisher.publishEvent(alarmEvent); } + + public void zlmOfflineEventPublish(String mediaServerId){ + ZLMOfflineEvent outEvent = new ZLMOfflineEvent(this); + outEvent.setMediaServerId(mediaServerId); + applicationEventPublisher.publishEvent(outEvent); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index caa68ef..7065558 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -359,8 +359,8 @@ type = "PULL"; } } - zlmMediaListManager.removeMedia( app, streamId); - redisCatchStorage.removeStream(mediaServerItem, OriginType.values()[item.getOriginType()].getType(), app, streamId); + zlmMediaListManager.removeMedia(app, streamId); + redisCatchStorage.removeStream(mediaServerItem, type, app, streamId); } // 鍙戦�佹祦鍙樺寲redis娑堟伅 diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index 71df295..5555617 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamProxyService; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -40,6 +41,9 @@ private IMediaServerService mediaServerService; @Autowired + private IRedisCatchStorage redisCatchStorage; + + @Autowired private MediaConfig mediaConfig; @Qualifier("taskExecutor") @@ -70,8 +74,14 @@ } }); - // TODO 璁㈤槄 zlm淇濇椿浜嬩欢, 褰搝lm绂荤嚎鏃跺仛涓氬姟鐨勫鐞� - + // 璁㈤槄 zlm淇濇椿浜嬩欢, 褰搝lm绂荤嚎鏃跺仛涓氬姟鐨勫鐞� + hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,null, + (MediaServerItem mediaServerItem, JSONObject response)->{ + String mediaServerId = response.getString("mediaServerId"); + if (mediaServerId !=null ) { + mediaServerService.updateMediaServerKeepalive(mediaServerId, response.getJSONObject("data")); + } + }); // 鑾峰彇zlm淇℃伅 logger.info("绛夊緟榛樿zlm鎺ュ叆..."); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java index 841c14c..7e3da46 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java @@ -65,6 +65,9 @@ @JSONField(name = "hook.admin_params") private String hookAdminParams; + @JSONField(name = "hook.alive_interval") + private int hookAliveInterval; + @JSONField(name = "hook.enable") private String hookEnable; @@ -791,4 +794,12 @@ public void setShellPhell(String shellPhell) { this.shellPhell = shellPhell; } + + public int getHookAliveInterval() { + return hookAliveInterval; + } + + public void setHookAliveInterval(int hookAliveInterval) { + this.hookAliveInterval = hookAliveInterval; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java index b7b4e28..260da27 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java @@ -39,6 +39,8 @@ private int streamNoneReaderDelayMS; + private int hookAliveInterval; + private boolean rtpEnable; private boolean status; @@ -87,6 +89,7 @@ autoConfig = true; // 榛樿鍊紅rue; secret = zlmServerConfig.getApiSecret(); streamNoneReaderDelayMS = zlmServerConfig.getGeneralStreamNoneReaderDelayMS(); + hookAliveInterval = zlmServerConfig.getHookAliveInterval(); rtpEnable = false; // 榛樿浣跨敤鍗曠鍙�;鐩村埌鐢ㄦ埛鑷繁璁剧疆寮�鍚绔彛 rtpPortRange = "30000,30500"; // 榛樿浣跨敤30000,30500浣滀负绾ц仈鏃跺彂閫佹祦鐨勭鍙e彿 sendRtpPortRange = "30000,30500"; // 榛樿浣跨敤30000,30500浣滀负绾ц仈鏃跺彂閫佹祦鐨勭鍙e彿 @@ -309,4 +312,12 @@ public void setSendRtpPortRange(String sendRtpPortRange) { this.sendRtpPortRange = sendRtpPortRange; } + + public int getHookAliveInterval() { + return hookAliveInterval; + } + + public void setHookAliveInterval(int hookAliveInterval) { + this.hookAliveInterval = hookAliveInterval; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java new file mode 100644 index 0000000..8ffbdde --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMEventAbstract.java @@ -0,0 +1,25 @@ +package com.genersoft.iot.vmp.media.zlm.event; + +import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; +import org.springframework.context.ApplicationEvent; + +public abstract class ZLMEventAbstract extends ApplicationEvent { + + + private static final long serialVersionUID = 1L; + + private String mediaServerId; + + + public ZLMEventAbstract(Object source) { + super(source); + } + + public String getMediaServerId() { + return mediaServerId; + } + + public void setMediaServerId(String mediaServerId) { + this.mediaServerId = mediaServerId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java index e539f23..fcba07f 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.service; +import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -29,6 +30,13 @@ * @return */ void zlmServerOnline(ZLMServerConfig zlmServerConfig); + + /** + * 鑺傜偣绂荤嚎 + * @param mediaServerId + * @return + */ + void zlmServerOffline(String mediaServerId); MediaServerItem getMediaServerForMinimumLoad(); @@ -67,4 +75,6 @@ void delete(String id); MediaServerItem getDefaultMediaServer(); + + void updateMediaServerKeepalive(String zlmServerConfig, JSONObject data); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java index 6922538..618b824 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; @@ -73,4 +74,19 @@ * @return */ StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId); + + + /** + * 鏂扮殑鑺傜偣鍔犲叆 + * @param zlmServerConfig + * @return + */ + void zlmServerOnline(ZLMServerConfig zlmServerConfig); + + /** + * 鑺傜偣绂荤嚎 + * @param mediaServerId + * @return + */ + void zlmServerOffline(String mediaServerId); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java index 7733254..d8a4465 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.service; import com.genersoft.iot.vmp.gb28181.bean.GbStream; +import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; @@ -46,4 +47,18 @@ */ boolean stop(String app, String streamId); + /** + * 鏂扮殑鑺傜偣鍔犲叆 + * @param zlmServerConfig + * @return + */ + void zlmServerOnline(ZLMServerConfig zlmServerConfig); + + /** + * 鑺傜偣绂荤嚎 + * @param mediaServerId + * @return + */ + void zlmServerOffline(String mediaServerId); + } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index b6bfc00..e02bd3f 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -97,6 +97,7 @@ if (!redisUtil.hasKey(key)) { redisUtil.set(key, mediaServerItem); } + } } @@ -272,6 +273,7 @@ WVPResult<String> result = new WVPResult<>(); mediaServerItem.setCreateTime(this.format.format(System.currentTimeMillis())); mediaServerItem.setUpdateTime(this.format.format(System.currentTimeMillis())); + mediaServerItem.setHookAliveInterval(120); JSONObject responseJSON = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); if (responseJSON != null) { JSONArray data = responseJSON.getJSONArray("data"); @@ -329,6 +331,7 @@ logger.warn("[鏈敞鍐岀殑zlm] 鎷掓帴鎺ュ叆锛氭潵鑷獅}锛歿}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); return; } + serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval()); if (serverItem.getHttpPort() == 0) { serverItem.setHttpPort(zlmServerConfig.getHttpPort()); } @@ -352,85 +355,29 @@ } if (StringUtils.isEmpty(serverItem.getId())) { serverItem.setId(zlmServerConfig.getGeneralMediaServerId()); + } + serverItem.setStatus(true); + if (StringUtils.isEmpty(serverItem.getId())) { + serverItem.setId(zlmServerConfig.getGeneralMediaServerId()); mediaServerMapper.updateByHostAndPort(serverItem); }else { mediaServerMapper.update(serverItem); } - if (redisUtil.get(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId()) == null) { + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId(); + if (redisUtil.get(key) == null) { SsrcConfig ssrcConfig = new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()); serverItem.setSsrcConfig(ssrcConfig); - redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + serverItem.getId(), serverItem); + redisUtil.set(key, serverItem); } - serverItem.setStatus(true); resetOnlineServerItem(serverItem); + updateMediaServerKeepalive(serverItem.getId(), null); setZLMConfig(serverItem); + } -// if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId()) -// || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) { -// // 閰嶇疆鏂囦欢鐨剒lm -// // 濡傛灉鏄厤缃枃浠朵腑鐨剒lm銆� 涔熷氨鏄粯璁lm銆� 涓�鍒囦互閰嶇疆鏂囦欢鍐呭涓哄噯 -// // wvp浜掓儬淇敼zlm鐨勭鍙o紝闇�瑕佽嚜琛岄厤缃�� -// MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem(); -// serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId()); -// if (mediaConfig.getHttpPort() == 0) { -// serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort()); -// } -// if (mediaConfig.getHttpSSlPort() == 0) { -// serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport()); -// } -// if (mediaConfig.getRtmpPort() == 0) { -// serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort()); -// } -// if (mediaConfig.getRtmpSSlPort() == 0) { -// serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort()); -// } -// if (mediaConfig.getRtspPort() == 0) { -// serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort()); -// } -// if (mediaConfig.getRtspSSLPort() == 0) { -// serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport()); -// } -// if (mediaConfig.getRtpProxyPort() == 0) { -// serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort()); -// } -// if (serverItem != null){ -// mediaServerMapper.delDefault(); -// mediaServerMapper.add(serverItemFromConfig); -// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId(); -// MediaServerItem serverItemInRedis = (MediaServerItem)redisUtil.get(key); -// if (serverItemInRedis != null) { -// serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig()); -// }else { -// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain())); -// } -// redisUtil.set(key, serverItemFromConfig); -// }else { -// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId(); -// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain())); -// redisUtil.set(key, serverItemFromConfig); -// mediaServerMapper.add(serverItemFromConfig); -// } -// resetOnlineServerItem(serverItemFromConfig); -// setZLMConfig(serverItemFromConfig); -// } - // 绉婚櫎鏈坊鍔犵殑zlm鐨勬帴鍏ワ紝鎵�鏈夌殑zlm蹇呴』鍏堟坊鍔犲悗鎵嶅彲浠ュ姞鍏ヤ娇鐢� -// else { -// String now = this.format.format(System.currentTimeMillis()); -// if (serverItem == null){ -// // 涓�涓柊鐨剒lm鎺ュ叆wvp -// serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp()); -// serverItem.setCreateTime(now); -// serverItem.setUpdateTime(now); -// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId(); -// serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain())); -// redisUtil.set(key, serverItem); -// // 瀛樺叆鏁版嵁搴� -// mediaServerMapper.add(serverItem); -// setZLMConfig(serverItem); -// } -// resetOnlineServerItem(serverItem); -// } + @Override + public void zlmServerOffline(String mediaServerId) { + delete(mediaServerId); } @Override @@ -611,9 +558,17 @@ @Override public void delete(String id) { - redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId() + "_", id); + redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(), id); String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + id; redisUtil.del(key); mediaServerMapper.delOne(id); } + + @Override + public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) { + MediaServerItem mediaServerItem = getOne(mediaServerId); + String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetup.getServerId() + "_" + mediaServerId; + int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2; + redisUtil.set(key, data, hookAliveInterval); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java index 0541124..907893d 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; +import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; @@ -49,6 +50,9 @@ @Autowired private StreamProxyMapper streamProxyMapper; + + @Autowired + private IRedisCatchStorage redisCatchStorage; @Autowired private GbStreamMapper gbStreamMapper; @@ -249,4 +253,20 @@ public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) { return videoManagerStorager.getStreamProxyByAppAndStream(app, streamId); } + + @Override + public void zlmServerOnline(ZLMServerConfig zlmServerConfig) { + + } + + @Override + public void zlmServerOffline(String mediaServerId) { + // 绉婚櫎寮�鍚簡鏃犱汉瑙傜湅鑷姩绉婚櫎鐨勬祦 + streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId); + // 鍏朵粬鐨勬祦璁剧疆鏈惎鐢� + streamProxyMapper.updateStatus(false, mediaServerId); + // 绉婚櫎redis鍐呮祦鐨勪俊鎭� + redisCatchStorage.removeStream(mediaServerId, "PULL"); + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index 7928d5a..7c17c2a 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.TypeReference; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; +import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; @@ -135,4 +136,18 @@ return true; } + @Override + public void zlmServerOnline(ZLMServerConfig zlmServerConfig) { + // 浼间箮娌″暐闇�瑕佸仛鐨� + } + + @Override + public void zlmServerOffline(String mediaServerId) { + // 绉婚櫎娌℃湁serverId鐨勬帹娴� + streamPushMapper.deleteWithoutGBId(mediaServerId); + // 鍏朵粬鐨勬祦璁剧疆鏈惎鐢� + gbStreamMapper.updateStatusByMediaServerId(mediaServerId, false); + // 绉婚櫎redis鍐呮祦鐨勪俊鎭� + redisCatchStorage.removeStream(mediaServerId, "PUSH"); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java index 0458941..0803dd6 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -146,6 +146,13 @@ */ void removeStream(MediaServerItem mediaServerItem, String type, String app, String streamId); + + /** + * 绉婚櫎娴佷俊鎭粠redis + * @param mediaServerId + */ + void removeStream(String mediaServerId, String type); + /** * 寮�濮嬩笅杞藉綍鍍忔椂瀛樺叆 * @param streamInfo diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index 4c988d9..18f30a5 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -422,4 +422,5 @@ * @return */ StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId); + } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index 84c04a1..f159925 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -60,4 +60,9 @@ @Select("SELECT gs.*, pgs.platformId FROM gb_stream gs LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream WHERE mediaServerId=#{mediaServerId} ") List<GbStream> selectAllByMediaServerId(String mediaServerId); + + @Update("UPDATE gb_stream " + + "SET status=${status} " + + "WHERE mediaServerId=#{mediaServerId} ") + void updateStatusByMediaServerId(String mediaServerId, boolean status); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java index aaa1845..4e09e79 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java @@ -36,7 +36,8 @@ "recordAssistPort, " + "defaultServer, " + "createTime, " + - "updateTime" + + "updateTime, " + + "hookAliveInterval" + ") VALUES " + "(" + "'${id}', " + @@ -60,7 +61,8 @@ "${recordAssistPort}, " + "${defaultServer}, " + "'${createTime}', " + - "'${updateTime}')") + "'${updateTime}', " + + "${hookAliveInterval})") int add(MediaServerItem mediaServerItem); @Update(value = {" <script>" + @@ -84,6 +86,7 @@ "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" + "<if test=\"secret != null\">, secret='${secret}'</if>" + "<if test=\"recordAssistPort != null\">, recordAssistPort=${recordAssistPort}</if>" + + "<if test=\"hookAliveInterval != null\">, hookAliveInterval=${hookAliveInterval}</if>" + "WHERE id='${id}'"+ " </script>"}) int update(MediaServerItem mediaServerItem); @@ -108,6 +111,7 @@ "<if test=\"sendRtpPortRange != null\">, sendRtpPortRange='${sendRtpPortRange}'</if>" + "<if test=\"secret != null\">, secret='${secret}'</if>" + "<if test=\"recordAssistPort != null\">, recordAssistPort=${recordAssistPort}</if>" + + "<if test=\"hookAliveInterval != null\">, hookAliveInterval=${hookAliveInterval}</if>" + "WHERE ip='${ip}' and httpPort=${httpPort}"+ " </script>"}) int updateByHostAndPort(MediaServerItem mediaServerItem); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java index 11753f7..82520ec 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java @@ -51,4 +51,17 @@ "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " + "WHERE st.enable=${enable} and st.mediaServerId = '${id}' order by st.createTime desc") List<StreamProxyItem> selectForEnableInMediaServer(String id, boolean enable); + + @Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " + + "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " + + "WHERE st.mediaServerId = '${id}' order by st.createTime desc") + List<StreamProxyItem> selectInMediaServer(String id); + + @Update("UPDATE stream_proxy " + + "SET enable=#{status} " + + "WHERE mediaServerId=#{mediaServerId}") + void updateStatus(boolean status, String mediaServerId); + + @Delete("DELETE FROM stream_proxy WHERE mediaServerId=#{mediaServerId}") + void deleteAutoRemoveItemByMediaServerId(String mediaServerId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java index 41e4c44..9fe6ebf 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java @@ -53,4 +53,7 @@ @Delete("DELETE FROM stream_push") void clear(); + @Delete("DELETE FROM stream_push WHERE mediaServerId=#{mediaServerId}") + void deleteWithoutGBId(String mediaServerId); + } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index 984b994..6adc05d 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -333,17 +333,14 @@ @Override public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, StreamInfo streamInfo) { - String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); redis.set(key, streamInfo); } @Override public void removeStream(MediaServerItem mediaServerItem, String type, String app, String streamId) { - String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + userSetup.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerItem.getId(); - List<Object> streams = redis.scan(key); - for (Object stream : streams) { - redis.del((String) stream); - } + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); + redis.del(key); } @Override @@ -359,4 +356,13 @@ JSONObject jsonObject = (JSONObject)redis.get(key); return JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class); } + + @Override + public void removeStream(String mediaServerId, String type) { + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_*_*_" + mediaServerId; + List<Object> streams = redis.scan(key); + for (Object stream : streams) { + redis.del((String) stream); + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index 35dda13..b7454a8 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -738,4 +738,5 @@ public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) { return streamProxyMapper.selectOne(app, streamId); } + } diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite index a1df173..e6140f4 100644 --- a/src/main/resources/wvp.sqlite +++ b/src/main/resources/wvp.sqlite Binary files differ diff --git a/src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java b/src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java index 20209f2..13479fe 100644 --- a/src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java +++ b/src/test/java/com/genersoft/iot/vmp/service/impl/RoleServiceImplTest.java @@ -25,7 +25,6 @@ void getAllUser() { List<Role> all = roleService.getAll(); Role roleById = roleService.getRoleById(1); - System.out.println(); } diff --git a/src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java b/src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java index 9e3c672..4114870 100644 --- a/src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java +++ b/src/test/java/com/genersoft/iot/vmp/service/impl/UserServiceImplTest.java @@ -27,10 +27,8 @@ @org.junit.jupiter.api.Test void getAllUser() { List<User> allUsers = userService.getAllUsers(); - System.out.println(userService.getAllUsers().size()); User admin = userService.getUser("admin", "21232f297a57a5a743894a0e4a801fc3"); User admin1 = userService.getUserByUsername("admin"); - System.out.println(12); } -- Gitblit v1.8.0