• 转: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。

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/phoebus0501/p/1878897.html
Copyright © 2020-2023  润新知