MINA2 线程总结
本文转自:http://blog.csdn.net/mrliu20082009/article/details/6990812
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端的Socket IoAcceptor 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("服务端与客户端创建连接..."); } }