MINA IoService - 正如 《Apache MINA 2.0 用户指南》第二章:基础知识 在介绍应用架构时提到过的,是支持所有
IO 服务的基类,不管是在服务器端还是在客户端。
它将处理所有与你的应用之间的交互,以及与远程对端的交互,发送并接收消息、管理 session、管理连接等等。
它是为一个接口,服务器端实现为 IoAcceptor,客户端为 IoConnector。
IoService 简介
IoService 提供了基本的
I/O 服务,并对
MINA 中的 session 进行管理。它是 MINA 架构中的最重要的部分之一。IoService 及其子接口的实现类处理了绝大多数的低层
I/O 操作。
IoService 思维导图
我们来看一下 IoService 及其实现类 AbstractIoService 的职责。我们这次用一种稍微不同的方法,首先使用一个 思维导图,之后深入分析内部工作。这张思维导图由 XMind 所画:
责任
由图中可以看出,
IoService 承担着很多职责:
- session 管理:创建和删除 session,检测闲置 session
- 过滤器链管理:操纵过滤器链,允许用户运行中改变过滤器链
- 处理器调用:接收到新消息时调用处理器,等等
- 统计管理:更新发送消息的数量、发送字节的数量,等等
- 监听器管理:管理用户创建的监听器
- 通信管理:在服务器端和服务器端处理传输的数据
以上都将在后续章节中详细讨论。
接口详情
IoService 是所有提供
I/O 服务和管理
I/O session 的
IoConnector 和
IoAcceptor 的基础接口。这一接口具有进行
I/O 相关操作的所有方法。
现在深入了解一下这个接口中的各种方法:
- getTransportMetadata()
- addListener()
- removeListener()
- isDisposing()
- isDisposed()
- dispose()
- getHandler()
- setHandler()
- getManagedSessions()
- getManagedSessionCount()
- getSessionConfig()
- getFilterChainBuilder()
- setFilterChainBuilder()
- getFilterChain()
- isActive()
- getActivationTime()
- broadcast()
- setSessionDataStructureFactory()
- getScheduledWriteBytes()
- getScheduledWriteMessages()
- getStatistics()
getTransportMetadata()
这一方法返回
IoAcceptor 或者
IoConnector 运行中传输的元数据。典型的细节包括提供者名 (nio、apr、rxtx)、连接类型 (无连接或有连接的) 等等。
addListener
允许添加一个
IoServiceListener 以监听
IoService 关联到的特殊事件。
removeListener
将附属于本
IoService 的
IoServiceListener 移除掉。
isDisposing
这个方法指出服务是否正在被处理中。因为它可能需要一段时间,有必要知道服务的当前状态。
isDisposed
这个方法指出服务是否已被处理结束。只有当其所分配的资源都被释放之后,这个服务才被认为是处理结束了。
dispose
这一方法释放服务所分配的所有资源。因为它可能需要一段时间,用户应该使用
isDisposing() 和
isDisposed() 检测服务状态以了解服务是否已完全处理。
在你关闭一个服务时,记得调用
dispose()!
getHandler
返回服务关联的
IoHandler。
setHandler
设置将负责处理服务所有事件的
IoHandler。处理器包含你的应用逻辑!
getManagedSessions
返回当前服务所管理的所有 session 集合。被管理的 session 是一个添加到服务监听器的 session。它将被用于处理闲置 session,以及其他 session 方面,取决于用户添加到服务的监听器的种类。
getManagedSessionCount
返回当前服务所管理的 session 数量。
getSessionConfig
返回 session 配置。
getFilterChainBuilder
返回过滤器链构建者。这在用户想要添加在 session 创建时要被注入的新的过滤器时很有用。
setFilterChainBuilder
定义服务使用的过滤器链构建者。
getFilterChain
返回当前服务默认的过滤器链。
isActive
返回服务是否是活动的。
getActivationTime
返回服务激活的时间。如果服务不再是活动的,将返回服务最后的激活状态的时间点。
broadcast
将给定消息写入所有管理的 session。
setSessionDataStructureFactory
设置为当前服务所创建的新 session 提供相关数据结构的
IoSessionDataStructureFactory。
getScheduledWriteBytes
返回计划要写入的字节的数量 (比如,保存在内存中,等待套接字写入的字节)。
getScheduledWriteMessages
返回计划要写入的消息的数量 (比如,保存在内存中,等待套接字写入的消息)。
getStatistics
返回当前服务的
IoServiceStatistics 对象。
IoService 细节
IoService 是一个接口,它被
MINA 中最重要的两个类实现:
要构建一个服务器,你需要选择一个
IoAcceptor 接口的实现。对于客户端应用,你需要选择一个
IoConnector 接口的实现。
IoAcceptor
根本上讲,
IoAcceptor 接口是因为
accept() 方法的缘故所命名,这个方法负责客户端和服务器端连接的创建。服务器端接收连入的连接请求。
某些情况下,我们可以把这一接口命名为 "Server" (将来的 MINA 3.0 中确实这样命名)。
因为我们可能要应对不止一种类型的传输协议 (TCP/UDP/...),我们为这一接口提供了多个实现。不太可能需要你再实现一个新的。
我们具有以下具体实现类:
- NioSocketAcceptor:非阻塞套接字传输 IoAcceptor
- NioDatagramAcceptor:非阻塞 UDP 传输 IoAcceptor
- AprSocketAcceptor:基于 APR 的阻塞套接字传输 IoAcceptor
- VmPipeSocketAcceptor:in-VM IoAcceptor
你只需挑选一个适合你需要的。
这里是
IoAcceptor 接口和类的类图:
创建
首先你要选择想要实例化的
IoAcceptor 类型。在早期的过程中就应该做出这一选择,这取决于你将使用的网络协议。现在看一下它是如何工作的一个例子:
public TcpServer() throws IOException {
// Create a TCP acceptor
IoAcceptor acceptor = new NioSocketAcceptor();
// Associate the acceptor to an IoHandler instance (your application)
acceptor.setHandler(this);
// Bind : this will start the server...
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("Server started...");
}
就是这样!你已经创建了一个 TCP 服务器。如果你想要启动一个 UDP 服务器,只需替换掉第一行代码:
...
// Create an UDP acceptor
IoAcceptor acceptor = new NioDatagramAcceptor();
...
销毁
服务可以通过调用
dispose() 方法进行停止。服务只能在所有等待中的 session 都被处理之后才能停止:
// Stop the service, waiting for the pending sessions to be inactive
acceptor.dispose();
你也可以通过传递给这个方法一个布尔类型的参数等待每一个执行中的线程正常结束:
// Stop the service, waiting for the processing session to be properly completed
acceptor.dispose( true );
状态
你可以通过调用以下方法之一拿到
IoService 的状态:
- isActive():如果服务能够接受连入请求返回 true
- isDisposing():如果 dispose() 方法已被调用返回 true。这并不能说明服务已经停止 (可能还有一些 session 正在处理中)
- isDisposed():如果 dispose(boolean) 方法已被调用、并且执行中的线程已经结束,返回 true
管理 IoHandler
当服务实例化之后你可以添加或者获取其关联到的
IoHandler。你只需要去调用一把
setHandler(IoHandler) 或者
getHandler() 方法。
管理过滤器链
如果你想要管理过滤器链,你得调用一把
getFilterChain() 方法,如下所示:
// Add a logger filter
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());
你也可以在将过滤器链设置进服务之前先创建它:
// Add a logger filter
DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
chain.addLast("logger", new LoggingFilter());
// And inject the created chain builder in the service
acceptor.setFilterChainBuilder(chain);
IoConnector
我们需要为客户端实现 IoConnector。我们提供了以下具体实现类:
- NioSocketConnector:非阻塞套接字传输 IoConnector
- NioDatagramConnector:非阻塞 UDP 传输 IoConnector
- AprSocketConnector:基于 APR 的阻塞套接字传输 IoConnector
- ProxyConnector:一个提供代理支持的 IoConnector
- SerialConnector:一个用于串行传输的 IoConnector
- VmPipeConnector:in-VM IoConnector
你只需挑选一个适合你需要的。
这里是 IoConnector 接口和类的类图:
原文链接: http://mina.apache.org/mina-project/userguide/ch3-service/ch3-service.html。