|  | @@ -0,0 +1,86 @@
 | 
	
		
			
				|  |  | +package com.genersoft.iot.vmp.gb28181.session;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.common.CommonCallback;
 | 
	
		
			
				|  |  | +import org.springframework.scheduling.annotation.Scheduled;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Component;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.util.Calendar;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 通用回调管理
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +@Component
 | 
	
		
			
				|  |  | +public class CommonSessionManager {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public static Map<String, CommonSession> callbackMap = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 存储回调相关的信息
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    class CommonSession{
 | 
	
		
			
				|  |  | +        public String session;
 | 
	
		
			
				|  |  | +        public long createTime;
 | 
	
		
			
				|  |  | +        public int timeout;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        public CommonCallback<Object> callback;
 | 
	
		
			
				|  |  | +        public CommonCallback<String> timeoutCallback;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 添加回调
 | 
	
		
			
				|  |  | +     * @param sessionId 唯一标识
 | 
	
		
			
				|  |  | +     * @param callback 回调
 | 
	
		
			
				|  |  | +     * @param timeout 超时时间, 单位分钟
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void add(String sessionId, CommonCallback<Object> callback, CommonCallback<String> timeoutCallback,
 | 
	
		
			
				|  |  | +                    Integer timeout) {
 | 
	
		
			
				|  |  | +        CommonSession commonSession = new CommonSession();
 | 
	
		
			
				|  |  | +        commonSession.session = sessionId;
 | 
	
		
			
				|  |  | +        commonSession.callback = callback;
 | 
	
		
			
				|  |  | +        commonSession.createTime = System.currentTimeMillis();
 | 
	
		
			
				|  |  | +        if (timeoutCallback != null) {
 | 
	
		
			
				|  |  | +            commonSession.timeoutCallback = timeoutCallback;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (timeout != null) {
 | 
	
		
			
				|  |  | +            commonSession.timeout = timeout;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        callbackMap.put(sessionId, commonSession);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void add(String sessionId, CommonCallback<Object> callback) {
 | 
	
		
			
				|  |  | +        add(sessionId, callback, null, 1);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public CommonCallback<Object> get(String sessionId, boolean destroy) {
 | 
	
		
			
				|  |  | +        CommonSession commonSession = callbackMap.get(sessionId);
 | 
	
		
			
				|  |  | +        if (destroy) {
 | 
	
		
			
				|  |  | +            callbackMap.remove(sessionId);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return commonSession.callback;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public CommonCallback<Object> get(String sessionId) {
 | 
	
		
			
				|  |  | +        return get(sessionId, false);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void delete(String sessionID) {
 | 
	
		
			
				|  |  | +        callbackMap.remove(sessionID);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Scheduled(fixedRate= 60)   //每分钟执行一次
 | 
	
		
			
				|  |  | +    public void execute(){
 | 
	
		
			
				|  |  | +        Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +        cal.add(Calendar.MINUTE, -1);
 | 
	
		
			
				|  |  | +        for (String session : callbackMap.keySet()) {
 | 
	
		
			
				|  |  | +            if (callbackMap.get(session).createTime < cal.getTimeInMillis()) {
 | 
	
		
			
				|  |  | +                // 超时
 | 
	
		
			
				|  |  | +                if (callbackMap.get(session).timeoutCallback != null) {
 | 
	
		
			
				|  |  | +                    callbackMap.get(session).timeoutCallback.run("timeout");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                callbackMap.remove(session);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |