|  | @@ -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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |