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://www.cnblogs.com/phinecos/archive/2008/12/04/1347752.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Java Unix Linux
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
当涉及到网络通信和高性能的Java应用程序时,Netty是一个强大的框架。它提供了许多功能和组件,其中之一是JNI传输。JNI传输是Netty的一个特性,它为特定平台提供了高效的网络传输。 在本文中,我们将深入探讨Netty提供的特定平台的JNI传输功能,分析其优势和适用场景。我们将介绍每个特定平台的JNI传输,并讨论其性能、可靠性和可扩展性。通过了解这些特定平台的JNI传输,您将能够更好地选择和配置适合您应用程序需求的网络传输方式,以实现最佳的性能和可靠性。
143 7
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
|
设计模式 监控 前端开发
第 10 章 Netty 核心源码剖析
第 10 章 Netty 核心源码剖析
130 0
|
存储 缓存 编解码
Netty源码剖析之核心组件
NioEventLoop有以下核心功能。 - 开启Selector并初始化。 - 把ServerSocketChannel注册到Selector上。 - 处理各种I/O事件,如OP_ACCEPT、OP_CONNECT、OP_READ、 OP_WRITE事件。 - 执行定时调度任务。 - 解决JDK空轮询bug。
120 0
探秘Netty5:基于Netty自己动手实现RPC框架
大厨小鲜——基于Netty自己动手实现RPC框架 钱文品 Good news everyone! ​关注他 71 人赞了该文章 今天我们要来做一道小菜,这道菜就是RPC通讯框架。
|
缓存 编解码 网络协议
Netty框架入门(一)
Netty框架入门(一)
240 0
Netty框架入门(一)
|
消息中间件 编解码 分布式计算
Netty源码分析系列之二:为什么选择Netty
本文主要介绍了使用Netty的好处与原因,它支持的协议越来越多,紧随JDK更新。从下文开始我们要对Netty的使用以及源码进行介绍。
|
Java 安全 API
Netty 源码阅读入门实战(一)-介绍
1 简介 以 Netty 为底层的框架 Netty 是什么 Netty 技术和方法的特点 设计 针对多种传输类型的统一接口 - 阻塞和非阻塞 简单但更强大的线程模型 真正的无连接的数据报套接字支持 链接逻辑支持复用 易用性 大量的 Javadoc 和 代码实例 除了在 JDK 1.6 + 额外的限制。
1745 0
Netty源码阅读入门实战(六)-pipeline
Netty源码阅读入门实战(六)-pipeline
890 0
|
Java
Netty 源码阅读入门实战(四)-NioEventLoop
1 NioEventLoop概述 总述 2 NioEventLoop创建概述 ...
1179 0
|
Web App开发 Java
探秘Netty6:基于Netty自己动手实现Web框架
大厨小鲜——基于Netty自己动手实现Web框架 钱文品 Good news everyone! ​关注他 17 人赞了该文章 上节课我们自己动手制作了一个RPC框架,本节课我们挑战一个稍有难度的一点的任务,手动制作一个Web框架。