JAVA Session管理

来源:互联网 发布:淘宝怎么找小二介入 编辑:程序博客网 时间:2024/06/16 10:41

public interface ICallback
{
    /**
     * 捕获异常
     * @param session Session
     */
    public void handleTimeout(Session session);
}

 

public class Session
{
   
    private final String id;
   
    private final int sessionTimeout;
   
    private ICallback callback;
   
    public Object obj1;
   
    /**
     * Session构造函数
     * @param id String
     */
    public Session(final String id, final int sessionTimeout)
    {
        this.id = id;
        this.sessionTimeout = sessionTimeout;
    }
   
    public ICallback getCallback()
    {
        return callback;
    }
   
    /**
     * setCallback
     * @param callback ICallback
     */
    public void setCallback(ICallback callback)
    {
        this.callback = callback;
        if (this.callback != null)
        {
            SessionManager.getInstance().addCallbackToSession(this, callback);
        }
    }
   
    public String getId()
    {
        return id;
    }
   
    public int getSessionTimeout()
    {
        return sessionTimeout;
    }
   
    /**
     * 发送消息
     * @param message 消息
     * @param channel Channel
      * @see [类、类#方法、类#成员]
     */
    public ChannelFuture sendMessage(AopMessage message, Channel channel)
    {
        if (channel != null && channel.isOpen())
        {
            return channel.write(message);
        }
        return null;
    }
   
    /**
     * hashCode
     * @return int
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
   
    /**
     * equals
     * @param obj Object
     * @return boolean
     */
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        Session other = (Session)obj;
        if (id == null)
        {
            if (other.id != null)
            {
                return false;
            }
        }
        else if (!id.equals(other.id))
        {
            return false;
        }
        return true;
    }
   
}

 

public class SessionManager
{
    private static final IDebugLogger LOG = LogFactory.getDebugLogger(SessionManager.class);
   
    private static SessionManager ins = new SessionManager();
   
    private final Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();
   
    private final Map<String, Timeout> timerMap = new ConcurrentHashMap<String, Timeout>();
   
    private final Timer timer = NettyServer.TIMER;
   
    private static int sessionTime;
   
    public void init()
    {
        UnModifyConfig unModifyConfig = BUS.getBean("unModifyConfig");
        sessionTime = unModifyConfig.getPushSessionTimeOut();
    }
   
    public static SessionManager getInstance()
    {
        return ins;
    }
   
    /**
     * 创建一个Session
     * @param id sessionID
     * @return Session
     * @see [类、类#方法、类#成员]
     */
    public Session createSession(String id)
    {
        LOG.debug("Begin to create session id = {}", id);
       
        final Session s = new Session(id, 0);
        sessionMap.put(id, s);
        return s;
    }
   
    public Session createSession(String id, int sessionTimeout)
    {
        LOG.debug("Begin to create session id = {}", id);
       
        final Session s = new Session(id, sessionTimeout);
        sessionMap.put(id, s);
        return s;
    }
   
    /**
     * addCallbackToSession
     * @param s Session
     * @param callback ICallback
     */
    public void addCallbackToSession(Session s, ICallback callback)
    {
        if (callback != null && s != null)
        {
            if (s.getSessionTimeout() != 0)
            {
                sessionTime = s.getSessionTimeout();
            }
           
            Timeout t = timer.newTimeout(new SessionTimeoutHandler(this, callback, s), sessionTime, TimeUnit.SECONDS);
            this.timerMap.put(s.getId(), t);
        }
    }
   
    /**
     * 删除一个Session (如果这个Session在创建的时候指定了callback,这里会删除定时器)
     * @param id sessionId
     * @return 要删除的session
     * @see [类、类#方法、类#成员]
     */
    public Object removeSession(String id)
    {
        LOG.debug("Begin to remove session id = {}", id);
       
        final Session s = sessionMap.remove(id);
        final Timeout timeout = timerMap.remove(id);
       
        if (null != timeout)
        {
            timeout.cancel();
        }
       
        if (s != null)
        {
            return s.obj1;
        }
        else
        {
            return null;
        }
    }
   
    public String getStatInfo()
    {
        return "SessionManager, sessionMap size:" + sessionMap.size() + ", timerMap size:" + timerMap.size();
    }
}

原创粉丝点击