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

  • 相关阅读:
    手动删除木马程序
    病毒注册表常用目标Svchost和Explorer
    对电脑假死现象的修复
    "添加与删除程序"报rundll32错误
    通过注册表regedit对Windows回收站进行恢复
    Win7的话,可能有十种简单的方法进行提速呢
    Windows死机的话,可能的一些猫病
    Android开发发布真机调试
    Java Web-----JSP与Servlet(一)
    Java——Log4j与Log4j2
  • 原文地址:https://www.cnblogs.com/phoebus0501/p/1878897.html
Copyright © 2020-2023  润新知