zoukankan      html  css  js  c++  java
  • 转:Mina2.0框架源码剖析(五)

    前面介绍过IoSessionRecycler是负责回收不再使用的会话的接口,ExpiringSessionRecycler是其一个实现类,用于回收超时失效的会话。

    private ExpiringMap<Object, IoSession> sessionMap;//待处理的会话集
    private ExpiringMap<Object, IoSession>.Expirer mapExpirer;//负责具体的回收工作

    sessionMap的键是由本地地址和远端地址共同组成的,值是这两个地址对应的会话。

    Expirer类实现了Runnable接口,这个线程负责监控ExpiringMap,并把ExpiringMap中超过阀值的元素从ExpiringMap中移除。这个线程调用了setDaemon(true),因此是作为守护线程在后台运行。具体的处理过程如下:

       private void processExpires() 
            {
                long timeNow = System.currentTimeMillis();//当前时间
                for (ExpiringObject o : delegate.values()) 
                {
                    if (timeToLiveMillis <= 0) 
                    {
                        continue;
                    }
                    long timeIdle = timeNow - o.getLastAccessTime();//时间差
                    if (timeIdle >= timeToLiveMillis) 
                    {//超时
                        delegate.remove(o.getKey());
                        for (ExpirationListener<V> listener : expirationListeners) 
                        {//呼叫监听者
                            listener.expired(o.getValue());
                        }
                    }
                }
            }

         启动/关闭超时检查线程都需要进行封锁机制,这里使用的是读写锁:

          private final ReadWriteLock stateLock = new ReentrantReadWriteLock();

            public void startExpiring() 
            {
                stateLock.writeLock().lock();
                try 
                {
                    if (!running) 
                    {
                        running = true;
                        expirerThread.start();
                    }
                } 
                finally 
                {
                    stateLock.writeLock().unlock();
                }
            }
            public void stopExpiring() 
            {
                stateLock.writeLock().lock();
                try 
                {
                    if (running) 
                    {
                        running = false;
                        expirerThread.interrupt();
                    }
                } 
                finally 
                {
                    stateLock.writeLock().unlock();
                }
            }

         会话超时监听者:

        private class DefaultExpirationListener implements
                ExpirationListener<IoSession> {
            public void expired(IoSession expiredSession) {
                expiredSession.close();//关闭超时的会话
            }
        }

    作者:phinecos(洞庭散人)
    出处:http://phinecos.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,并在文章页面明显位置给出原文连接。

    作者:洞庭散人

    出处:http://phinecos.cnblogs.com/    

    本博客遵从Creative Commons Attribution 3.0 License,若用于非商业目的,您可以自由转载,但请保留原作者信息和文章链接URL。

  • 相关阅读:
    typedef和define的详细区别
    谈谈Android Activity的生命周期管理
    【Android面试】Android面试题集锦 (陆续更新)(最新2012618)
    [ZZ]Ubuntu<>Windows 远程桌面连接(debian等同)
    C语言中的全局变量内存分配和初始化顺序
    [刘未鹏]怎样花两年时间去面试一个人
    线程间通信常用的三种方法
    C语言const详解
    细雨寒风水冰 no
    C#读取*.sql文件,并执行里面的SQL语句 no
  • 原文地址:https://www.cnblogs.com/phoebus0501/p/1878897.html
Copyright © 2011-2022 走看看