|
|
@@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.HookType;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
@@ -13,21 +16,22 @@ import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
- * @description:针对 ZLMediaServer的hook事件订阅
|
|
|
- * @author: pan
|
|
|
- * @date: 2020年12月2日 21:17:32
|
|
|
+ * ZLMediaServer的hook事件订阅
|
|
|
+ * @author lin
|
|
|
*/
|
|
|
@Component
|
|
|
-public class ZLMHttpHookSubscribe {
|
|
|
+public class ZlmHttpHookSubscribe {
|
|
|
+
|
|
|
+ private final static Logger logger = LoggerFactory.getLogger(ZlmHttpHookSubscribe.class);
|
|
|
|
|
|
@FunctionalInterface
|
|
|
public interface Event{
|
|
|
void response(MediaServerItem mediaServerItem, JSONObject response);
|
|
|
}
|
|
|
|
|
|
- private Map<HookType, Map<IHookSubscribe, ZLMHttpHookSubscribe.Event>> allSubscribes = new ConcurrentHashMap<>();
|
|
|
+ private Map<HookType, Map<IHookSubscribe, ZlmHttpHookSubscribe.Event>> allSubscribes = new ConcurrentHashMap<>();
|
|
|
|
|
|
- public void addSubscribe(IHookSubscribe hookSubscribe, ZLMHttpHookSubscribe.Event event) {
|
|
|
+ public void addSubscribe(IHookSubscribe hookSubscribe, ZlmHttpHookSubscribe.Event event) {
|
|
|
if (hookSubscribe.getExpires() == null) {
|
|
|
// 默认5分钟过期
|
|
|
Instant expiresInstant = Instant.now().plusSeconds(TimeUnit.MINUTES.toSeconds(5));
|
|
|
@@ -36,8 +40,8 @@ public class ZLMHttpHookSubscribe {
|
|
|
allSubscribes.computeIfAbsent(hookSubscribe.getHookType(), k -> new ConcurrentHashMap<>()).put(hookSubscribe, event);
|
|
|
}
|
|
|
|
|
|
- public ZLMHttpHookSubscribe.Event sendNotify(HookType type, JSONObject hookResponse) {
|
|
|
- ZLMHttpHookSubscribe.Event event= null;
|
|
|
+ public ZlmHttpHookSubscribe.Event sendNotify(HookType type, JSONObject hookResponse) {
|
|
|
+ ZlmHttpHookSubscribe.Event event= null;
|
|
|
Map<IHookSubscribe, Event> eventMap = allSubscribes.get(type);
|
|
|
if (eventMap == null) {
|
|
|
return null;
|
|
|
@@ -69,8 +73,8 @@ public class ZLMHttpHookSubscribe {
|
|
|
|
|
|
Set<Map.Entry<IHookSubscribe, Event>> entries = eventMap.entrySet();
|
|
|
if (entries.size() > 0) {
|
|
|
- List<Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event>> entriesToRemove = new ArrayList<>();
|
|
|
- for (Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event> entry : entries) {
|
|
|
+ List<Map.Entry<IHookSubscribe, ZlmHttpHookSubscribe.Event>> entriesToRemove = new ArrayList<>();
|
|
|
+ for (Map.Entry<IHookSubscribe, ZlmHttpHookSubscribe.Event> entry : entries) {
|
|
|
JSONObject content = entry.getKey().getContent();
|
|
|
if (content == null || content.size() == 0) {
|
|
|
entriesToRemove.add(entry);
|
|
|
@@ -87,13 +91,13 @@ public class ZLMHttpHookSubscribe {
|
|
|
result = result && content.getString(s).equals(hookSubscribe.getContent().getString(s));
|
|
|
}
|
|
|
}
|
|
|
- if (null != result && result){
|
|
|
+ if (result){
|
|
|
entriesToRemove.add(entry);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(entriesToRemove)) {
|
|
|
- for (Map.Entry<IHookSubscribe, ZLMHttpHookSubscribe.Event> entry : entriesToRemove) {
|
|
|
+ for (Map.Entry<IHookSubscribe, ZlmHttpHookSubscribe.Event> entry : entriesToRemove) {
|
|
|
entries.remove(entry);
|
|
|
}
|
|
|
}
|
|
|
@@ -106,12 +110,12 @@ public class ZLMHttpHookSubscribe {
|
|
|
* @param type
|
|
|
* @return
|
|
|
*/
|
|
|
- public List<ZLMHttpHookSubscribe.Event> getSubscribes(HookType type) {
|
|
|
+ public List<ZlmHttpHookSubscribe.Event> getSubscribes(HookType type) {
|
|
|
Map<IHookSubscribe, Event> eventMap = allSubscribes.get(type);
|
|
|
if (eventMap == null) {
|
|
|
return null;
|
|
|
}
|
|
|
- List<ZLMHttpHookSubscribe.Event> result = new ArrayList<>();
|
|
|
+ List<ZlmHttpHookSubscribe.Event> result = new ArrayList<>();
|
|
|
for (IHookSubscribe key : eventMap.keySet()) {
|
|
|
result.add(eventMap.get(key));
|
|
|
}
|
|
|
@@ -127,5 +131,28 @@ public class ZLMHttpHookSubscribe {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 对订阅数据进行过期清理
|
|
|
+ */
|
|
|
+ @Scheduled(cron="0 0/5 * * * ?") //每5分钟执行一次
|
|
|
+ public void execute(){
|
|
|
|
|
|
+ logger.info("[hook订阅] 清理");
|
|
|
+
|
|
|
+ Instant instant = Instant.now().minusMillis(TimeUnit.MINUTES.toMillis(5));
|
|
|
+ int total = 0;
|
|
|
+ for (HookType hookType : allSubscribes.keySet()) {
|
|
|
+ Map<IHookSubscribe, Event> hookSubscribeEventMap = allSubscribes.get(hookType);
|
|
|
+ if (hookSubscribeEventMap.size() > 0) {
|
|
|
+ for (IHookSubscribe hookSubscribe : hookSubscribeEventMap.keySet()) {
|
|
|
+ if (hookSubscribe.getExpires().isBefore(instant)) {
|
|
|
+ // 过期的
|
|
|
+ hookSubscribeEventMap.remove(hookSubscribe);
|
|
|
+ total ++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ logger.info("[hook订阅] 清理结束,共清理{}条过期数据", total);
|
|
|
+ }
|
|
|
}
|