mina2线程总结
1主要流程

read in data:
IO读入(IoProcessor)?日志记录、解码、threadPool(IoFilter)?业务逻辑处理(IoHandler)
write out data:
业务逻辑处理(IoHandler)?日志记录、编码、threadPool(IoFilter)? IO写出(IoProcessor)
由以上可以看出,IO读入和IO写出的过程是相反的。
2线程
这里主要讨论一下Mina中的线程,使用线程,线程池可以提高性能,Mina中就使用了几种线程:
?IoAcceptor/IoConnector线程?IoProcessor线程?IoHandler线程
2.1IoAcceptor/IoConnector线程
IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:
public NioSocketAcceptor(Executor executor, IoProcessor<NioSession> processor) {}public NioSocketConnector(Executor executor, IoProcessor<NioSession> processor) {}protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {//省略部分代码if (executor == null) {this.executor = Executors.newCachedThreadPool();createdExecutor = true;} else {this.executor = executor;createdExecutor = false;}}IoConnector connector = new NioSocketConnector(9);IoAcceptor acceptor = new NioSocketAcceptor(9);
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType, Executor executor, int size) { //省略部分代码 if (createdExecutor) { this.executor = Executors.newCachedThreadPool(); } else { this.executor = executor; }}acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));public class MinaTest {protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);private static int PORT = 9999;public static void main(String[] args) {try {// 创建一个非阻塞的server端的SocketIoAcceptor acceptor = new NioSocketAcceptor();// 设置过滤器acceptor.getFilterChain().addLast("logger", new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));// 设置读取数据的缓冲区大小acceptor.getSessionConfig().setReadBufferSize(2048);// 读写通道10秒内无操作进入空闲状态acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);// 绑定逻辑处理器acceptor.setHandler(new MinaServerHandler());// 绑定端口acceptor.bind(new InetSocketAddress(PORT));logger.info("服务端启动成功... 端口号为:" + PORT);} catch (Exception e) {logger.error("服务端启动异常....", e);e.printStackTrace();}}}public class MinaServerHandler extends IoHandlerAdapter {protected static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);public void exceptionCaught(IoSession session, Throwable cause) throws Exception {logger.error("服务端发送异常...", cause);}public void messageReceived(IoSession session, Object message) throws Exception {String msg = message.toString();//如果是quit就关闭session退出 if ("quit".equals(msg)) {session.close();}Date date = new Date();session.write(date.toString());}public void sessionCreated(IoSession session) throws Exception {logger.info("服务端与客户端创建连接...");}}