MINA主要架构图
What is Mina ?
Mina 架构
Mina 线程模型
Mina 事件驱动
Mina 异步
Mina 过滤器 (线程池,协议编解码器)
Mina 业务处理接口
Mina 类图
?
What is Mina ?
一个网络应用框架
高性能,高伸缩性
异步的
事件驱动的API
支持TCP/IP, UDP/IP, 串口,虚拟机内部管道等协议
?
Mina 架构-应用
从应用角度看mina架构
?
Mina基本接口
-- IoService 服务端和客户端的抽象
–IoAccepter? 相当于网络应用程序中的服务器端
–IoConnector 相当于客户端
–IoSession 当前客户端到服务器端的一个连接实例
–IoHandler 业务处理接口
–IoFilterChina 过滤器链
–IoFilter?? 过滤器用于连接通讯层接口与业务层接口
–IoProcessor I/O读写服务
?
Mina NIO Socket 线程模型
Acceptor Thread :
??? 接受客户端连接,将连接导入Processor线程, ?mina自动生成, 单线程,不可配置
Connector Thread:
??? 客户端连接线程, 将与服务器的连接导入到Processor, mina自动生成, 单线程,不可配置
Processor Thread:
??? 接受,发送数据, ?默认为CPU个数加一, 可配置 new NioSocketAcceptor(processorNum);
?
服务端处理过程
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.bind(new InetSocketAddress(8888));
?
Mina 事件封装
Apache MINA 提供事件驱动的 API
将网络有关的各种活动抽象成事件
会话创建,打开,关闭,消息接收,发送等
?
事件专递过程
?
?
事件传递基础-职责链模式
IoFilterChain filterChain = session.getFilterChain();
filterChain.fireMessageReceived(buf);
?
?
Mina 异步
Mina中很多操作都是异步的,它只管投递异步操作,不会阻塞业务流程
WriteFuture future = session.write(Object)
writeRequestQueue? 写请求队列
ConnectFuture future = connector.connect(new InetSocketAddress(?"127.0.0.1", 8888));
future.addListener(IoFutureListener) // 设置监听器
connectQueue 链接请求队列
ReadFuture r = session.read();
readyReadFutures 读队列
CloseFuture c = session.close(true)
removingSessions 关闭队列
?
?
Mina 过滤器
ProtocolCodecFilter?? 协议编解码器
acceptor.getFilterChain().addLast(“last",new ProtocolCodecFilter(new ObjectEncoder(),new ObjectDecoder()));
?
ExecutorFilter?? 线程化
???? acceptor.getFilterChain().addLast(“last",new
ExecutorFilter(Executors.newCachedThreadPool()));
?
协议编解码器
CumulativeProtocolDecoder
数据流累积解码器
反序列化时需要知道接受的流是否等于发送的对象的大小,否则反序列化就可能失败。
?
ExectorFilter
ExecutorFilter是一个IoFilter
用于将进入的I/O事件转到一个 java.util.concurrent.Executor实现。事件会从这个Executor转到下一个IoFilter,通常是一个线程池。可以在 IoFilterChain的任何地方增加任意数目的ExecutorFilter,实现任何类型的线程模型
?
ExectorFilter 模型
?
Mina?业务处理接口
IoHandlerAdapter
抽象类, 默认实现IoHandler接口
acceptor.setHandler(new ServerHandler());
?
?
IoHandler 业务处理接口
void exceptionCaught(IoSession session, Throwable cause) 当接口中其他方法抛出异常未被捕获时触发此方法
void messageReceived(IoSession session, Object message)? 当接收到客户端的请求信息后触发此方法
void messageSent(IoSession session, Object message) 当信息已经传送给客户端后触发此方法
void sessionClosed(IoSession session) 当连接被关闭时触发,例如客户端程序意外退出等等
void sessionCreated(IoSession session) 当一个新客户端连接后触发此方法
void sessionIdle(IoSession session, IdleStatus status) 当连接空闲时触发此方法
void sessionOpened(IoSession session) 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发
?
类图
?
与JMX集成
Apache MINA 可以集成 JMX 来对网络应用进行管理和监测
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
IoAcceptor acceptor = new NioSocketAcceptor(); // 服务端
IoServiceMBean acceptorMBean = new IoServiceMBean(acceptor);
ObjectName acceptorName = new ObjectName(“”);
mBeanServer.registerMBean(acceptorMBean, acceptorName); // 注册