mina是目前很流行的一个网络应用框架,用以帮助用户构建高性能和高伸缩性的网络应用。称其为网络应用框架,主要是其极强的扩展性,支持包括http,ssh,ftp等在内的多种应用层协议。而它本身封装了底层的TCP, UDP等通信协议,使用也非常方便。本文的重点是分析源码,了解它的多线程模型。源码版本为apache-mina-2.0.7。
为了有助于理解,先简单介绍一下mina的整体架构。如下图所示,其分为三层。在通信层之上,是IOService,提供IO服务,管理连接信息,它包含两个实现,一个是IOAcceptor,位于服务器,一个是IOConnector,处在客户端。在IOService之上,是IOFilterChain,作为一个容器,包含一系列IOFilter,做一些通用的数据处理,像协议的转换,多线程,日志等。最上层是IOHandler,负责执行用户的业务逻辑。
(来源http://mina.apache.org/mina-project/userguide/ch2-basics/application-architecture.html)
下面将按照服务器启动,连接监听,IO处理的顺序来对mina的多线程框架展开分析。
为了有助于理解,先简单介绍一下mina的整体架构。如下图所示,其分为三层。在通信层之上,是IOService,提供IO服务,管理连接信息,它包含两个实现,一个是IOAcceptor,位于服务器,一个是IOConnector,处在客户端。在IOService之上,是IOFilterChain,作为一个容器,包含一系列IOFilter,做一些通用的数据处理,像协议的转换,多线程,日志等。最上层是IOHandler,负责执行用户的业务逻辑。
(来源http://mina.apache.org/mina-project/userguide/ch2-basics/application-architecture.html)
下面将按照服务器启动,连接监听,IO处理的顺序来对mina的多线程框架展开分析。
protected final Set<SocketAddress> bindInternal(List<? extends SocketAddress> localAddresses) throws Exception {
....
// cr eates the Acceptor instance and has the local
// executor kick it off.
startupAcceptor();
.....
}
private void startupAcceptor() throws InterruptedException {
......
// start the acceptor if not already started
Acceptor acceptor = acceptorRef.get();
if (acceptor == null) {
lock.acquire();
acceptor = new Acceptor();
if (acceptorRef.compareAndSet(null, acceptor)) {
ex