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