package com.fastbee.base.session; import com.fastbee.common.enums.ServerType; import com.fastbee.common.utils.spring.SpringUtils; import com.fastbee.base.service.ISessionStore; import io.netty.channel.Channel; import lombok.extern.slf4j.Slf4j; import java.net.InetSocketAddress; import java.util.Collection; import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; /** * session管理 * @author gsb * @date 2022/11/7 8:55 */ @Slf4j public class SessionManager { private final Class sessionKeys; private final SessionListener sessionListener; /*Session会话存储*/ private static ISessionStore sessionStore = SpringUtils.getBean(ISessionStore.class); public SessionManager(){ this(null,null); } public SessionManager(SessionListener sessionListener){ this(null,sessionListener); } public SessionManager(Class sessionKeys, SessionListener sessionListener){ this.sessionKeys = sessionKeys; this.sessionListener = sessionListener; } /** * 获取Session */ public Session getSession(String clientId) { return sessionStore.getSession(clientId); } /** * 获取所有session */ public Collection all(){ return sessionStore.getSessionMap().values(); } /** * 新建session TCP * @return */ public Session newInstance(Channel channel){ InetSocketAddress sender = (InetSocketAddress) channel.remoteAddress(); Session session = new Session(this, channel, sender, s -> { channel.close(); return true; }, false, ServerType.TCP); if (sessionListener != null) { try { sessionListener.sessionCreated(session); } catch (Exception e) { log.error("sessionCreated", e); } } return session; } /** * 新建session UDP */ public Session newInstance(Channel channel, InetSocketAddress sender, Function remover) { Session session = new Session(this, channel, sender, remover, true,ServerType.UDP); if (sessionListener != null) { try { sessionListener.sessionCreated(session); } catch (Exception e) { log.error("sessionCreated", e); } } return session; } /** * 设备端离线 */ protected void remove(Session session){ sessionStore.cleanSession(session.getClientId()); if (null != sessionListener){ try { //设备状态业务处理 sessionListener.sessionDestroyed(session); }catch (Exception e){ log.error("设备端离线异常",e); } } } /** * 设备端上线 */ protected void add(Session session){ sessionStore.storeSession(session.getClientId().toUpperCase(),session); if (null != sessionListener){ try { sessionListener.sessionRegistered(session); }catch (Exception e){ log.error("设备端注册",e); } } } public Class getSessionKeys(){ return sessionKeys; } }