`

Mina 框架源码解析-NioSocketAcceptor启动过程

 
阅读更多

Mina 框架源码解析-NioSocketAcceptor启动过程

在HeartBeatServer 中,有一句启动Server端的代码

// 创建一个非阻塞的server端的Socket
acceptor = new NioSocketAcceptor();

 下面分析这个 new NioSocketAcceptor的过程:

 

1,NioSocketAcceptor 类头声明

public final class NioSocketAcceptor
        extends AbstractPollingIoAcceptor<NioSession, ServerSocketChannel>
        implements SocketAcceptor {

 继承了AbstractPollingIoAcceptor 类,实现SocketAcceptor 接口

 

2,看AbstractPollingIoAcceptor 类,

类头声明

public abstract class AbstractPollingIoAcceptor<S extends AbstractIoSession, H>
        extends AbstractIoAcceptor {

继承了AbstractIoAcceptor 类,AbstractIoAcceptor 类说明请看第3点

AbstractPollingIoAcceptor 类加载的时候初始化了这些

 private final Queue<AcceptorOperationFuture> registerQueue = new ConcurrentLinkedQueue<AcceptorOperationFuture>();

 private final Queue<AcceptorOperationFuture> cancelQueue = new ConcurrentLinkedQueue<AcceptorOperationFuture>();

 private final Map<SocketAddress, H> boundHandles = Collections.synchronizedMap(new HashMap<SocketAddress, H>());

 private final ServiceOperationFuture disposalFuture = new ServiceOperationFuture();

    /** The thread responsible of accepting incoming requests */ 
 private AtomicReference<Acceptor> acceptorRef = new AtomicReference<Acceptor>();

 

3,AbstractIoAcceptor 类头声明

public abstract class AbstractIoAcceptor 
        extends AbstractIoService implements IoAcceptor {

 继承AbstractIoService 类,AbstractIoService类实现IoService接口

public abstract class AbstractIoService implements IoService {

AbstractIoAcceptor 类在加载时初始化这些

    private final List<SocketAddress> defaultLocalAddresses =
        new ArrayList<SocketAddress>();
    private final List<SocketAddress> unmodifiableDefaultLocalAddresses =
        Collections.unmodifiableList(defaultLocalAddresses);
    private final Set<SocketAddress> boundAddresses =
        new HashSet<SocketAddress>();

    private boolean disconnectOnUnbind = true;

    /**
     * 当bind或unbind操作的时候需要获得的锁对象
     * The lock object which is acquired while bind or unbind operation is performed.
     * Acquire this lock in your property setters which shouldn't be changed while
     * the service is bound.
     */
    protected final Object bindLock = new Object();
 

 

4,SocketAcceptor 接口,AbstractPollingIoAcceptor 构造函数等先不看,那只不过是实现一种规范而已。

 

5,回到NioSocketAcceptor 类,进入构造方法

    public NioSocketAcceptor() {
    	/** 使用默认的Socket配置 
    	 * 调用父类的构造器  ,将默认配置传入到父类中,第二个参数NioProcessor.class 是动态类加载,会放到线程池上运行
    	 * 在父类AbstractPollingIoAcceptor的构造方法中调用init()接口,在子类中会调用init()接口的实现,因而初始化了selector
    	 * protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
         *     Class<? extends IoProcessor<S>> processorClass) {
         * 	this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass),true);
    	 *	}
    	 * */
        super(new DefaultSocketSessionConfig(), NioProcessor.class);//标记2
      
        ((DefaultSocketSessionConfig) getSessionConfig()).init(this);
    }

 super方法(标记2),调用父类AbstractPollingIoAcceptor 构造方法,初始化了DefaultSocketSessionConfig 类,并和NioProcessor .class 传递给上一级构造方法,构造方法如下

protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
            Class<? extends IoProcessor<S>> processorClass) {
    	//初始化selector,捕获一些异常,将处理器类加载进来
        this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass),
                true);//标记3
    }

 this使用(标记3),接收到下级传来的DefaultSocketSessionConfig和NioProcessor, 并用SimpleIoProcessorPool初始化,(SimpleIoProcessorPool将在下一节介绍),再次传递给AbstractPollingIoAcceptor 类的构造方法

 private AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
            Executor executor, IoProcessor<S> processor,
            boolean createdProcessor) {
        super(sessionConfig, executor);//标记4

        if (processor == null) {
            throw new IllegalArgumentException("processor");
        }

        this.processor = processor;//new SimpleIoProcessorPool()
        this.createdProcessor = createdProcessor;//是否创建新的处理池

        try {
            // Initialize the selector
            init();//初始化selector,因此在此处是抽象类,所以最终执行的是实体类的init(),也就是继承了此抽象类的实体类NioSocketAcceptor
            
            // The selector is now ready, we can switch the
            // flag to true so that incoming connection can be accepted
            selectable = true;
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeIoException("Failed to initialize.", e);
        } finally {
            if (!selectable) {
                try {
                    destroy();
                } catch (Exception e) {
                    ExceptionMonitor.getInstance().exceptionCaught(e);
                }
            }
        }
    }

 super方法(标记4),调用父类AbstractIoAcceptor 的构造方法

   protected AbstractIoAcceptor(IoSessionConfig sessionConfig, Executor executor) {
        super(sessionConfig, executor);//标记5
        defaultLocalAddresses.add(null);
    }

 此处super方法(标记5),调用父类AbstractIoService 的构造方法,线程池等在此处初始化

/**
     * 构造器,必须提供一个session配置和一个线程执行器,如果线程执行器为空,则会自动创建一个新的线程池
     * Constructor for {@link AbstractIoService}. You need to provide a default
     * session configuration and an {@link Executor} for handling I/O events. If
     * a null {@link Executor} is provided, a default one will be created using
     * {@link Executors#newCachedThreadPool()}.
     * 
     * @param sessionConfig
     *            the default configuration for the managed {@link IoSession}
     * @param executor
     *            the {@link Executor} used for handling execution of I/O
     *            events. Can be <code>null</code>.
     */
    protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {
        if (sessionConfig == null) {
            throw new IllegalArgumentException("sessionConfig");
        }

        if (getTransportMetadata() == null) {
            throw new IllegalArgumentException("TransportMetadata");
        }

        if (!getTransportMetadata().getSessionConfigType().isAssignableFrom(
                sessionConfig.getClass())) {
            throw new IllegalArgumentException("sessionConfig type: "
                    + sessionConfig.getClass() + " (expected: "
                    + getTransportMetadata().getSessionConfigType() + ")");
        }

        // Create the listeners, and add a first listener : a activation listener
        // for this service, which will give information on the service state.
        listeners = new IoServiceListenerSupport(this);
        listeners.add(serviceActivationListener);

        // Stores the given session configuration
        this.sessionConfig = sessionConfig;

        // Make JVM load the exception monitor before some transports
        // change the thread context class loader.
        ExceptionMonitor.getInstance();

        if (executor == null) {
            this.executor = Executors.newCachedThreadPool();
            createdExecutor = true;
        } else {
            this.executor = executor;
            createdExecutor = false;
        }

        threadName = getClass().getSimpleName() + '-' + id.incrementAndGet();
    }

 初始化Listener监听机制,就完成了new NioSocketAcceptor()的过程,Listener监听机制将在以后讲解,下一节是

Mina SimpleIoProcessor 的实现

分享到:
评论
1 楼 xiucaiyao 2014-06-05  

相关推荐

    Mina 2.0快速入门与源码解析

    ### Mina 2.0快速入门与源码解析 #### Mina 2.0 快速入门 Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得...

    springboot 整合mina 源码,nio通讯基础教程,mina框架基础教程.rar

    在本教程中,我们将深入探讨如何整合Spring Boot与Mina框架,同时介绍Java NIO(非阻塞I/O)的基础知识。Spring Boot以其简洁、快速的起步方式深受开发者喜爱,而Mina则是一个强大的网络通信框架,常用于构建高性能...

    MINA源码分析,内涵类的讲解

    在这个“MINA源码分析,内涵类的讲解”中,我们将深入探讨MINA的核心组件和设计模式,以便更好地理解和利用这个强大的框架。 首先,我们需要了解MINA的基础架构。MINA的核心是`IoService`接口,它定义了服务端和...

    mina源码走读与实例

    - **作用**:`IoBuffer`是MINA框架内部使用的`ByteBuffer`的封装,主要用于处理二进制数据的读写操作。 #### 三、创建连接各接口调用顺序 创建连接过程中涉及的主要接口调用顺序如下图所示: ![创建连接调用顺序]...

    mina实现多人聊天工程源码

    总的来说,"mina实现多人聊天工程源码"为我们提供了一个学习Mina框架和网络编程的好机会。通过对源码的深入研究,我们可以掌握如何使用Mina构建高效、稳定的网络应用,同时也能了解到网络通信中的一些常见设计模式和...

    mina自定义编码解码器

    在Java的网络编程中,Apache Mina是一个非常重要的框架,它提供了一个高度可扩展和高性能的网络应用程序开发基础。Mina允许开发者构建基于TCP、UDP等传输协议的服务器端和客户端应用,而无需关注底层的Socket编程...

    android mina使用

    在 Android 开发中,有时我们需要实现复杂的网络通信功能,例如TCP或UDP通信,这时Android Mina框架就显得尤为重要。Mina 是一个开源的网络通信框架,源自Java平台,但在Android上也能很好地运行。它提供了一个高效...

    mina服务器简单代码示例

    Mina服务器是一个基于Java开发的网络通信框架,它提供了高度可扩展和高性能的服务端和客户端API,常用于构建网络应用,如TCP/IP和UDP服务。本示例将介绍如何使用Mina实现一个简单的服务器端代码,并运行...

    基于Mina的Http Server以及简单的Http请求客户端

    本篇将介绍如何基于Apache Mina框架构建一个简单的HTTP服务器,并实现一个基本的HTTP请求客户端。 Apache Mina是一个开源项目,它提供了一个简单且高度可扩展的网络通信框架,支持多种协议,包括TCP、UDP、HTTP、...

    Apache MINA (2) Hello World!

    Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可伸缩和高性能的网络应用程序,如服务器。这个“Apache MINA (2) Hello World!”示例旨在帮助初学者理解MINA的基本用法。 MINA的核心概念...

    关于MinaIoFilter源码的个人理解

    #### Mina框架简介 Apache Mina是一个高度可伸缩、稳定并且具有丰富特性的网络应用程序框架,适用于开发高性能、高可靠性的网络应用程序。它支持多种传输协议,如TCP/IP、UDP/IP、SSL/TLS等,并提供了一种基于过滤...

Global site tag (gtag.js) - Google Analytics