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 callbackMap = new ConcurrentHashMap<>(); /** * 存储回调相关的信息 */ class CommonSession{ public String session; public long createTime; public int timeout; public CommonCallback callback; public CommonCallback timeoutCallback; } /** * 添加回调 * @param sessionId 唯一标识 * @param callback 回调 * @param timeout 超时时间, 单位分钟 */ public void add(String sessionId, CommonCallback callback, CommonCallback 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 callback) { add(sessionId, callback, null, 1); } public CommonCallback get(String sessionId, boolean destroy) { CommonSession commonSession = callbackMap.get(sessionId); if (destroy) { callbackMap.remove(sessionId); } return commonSession.callback; } public CommonCallback 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); } } } }