1.线程 使用线程,线程池可以提高性能,MINA中使用的线程如下: IoAcceptor/IoConnector线程 IoProcessor线程 IoHandler线程
1.1 IoAcceptor/IoConnector线程 IoAcceptor 用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务器端建立连接,每连接一个服务器就建立一个线程。这俩个线程都是通过线程池建立的,我们可以在构造对象的时候就指定线程池类型。 默认的线程池类型为:newCachedThreadPool,这是一个根据需要创建线程的线程池,在以前构造的线程可用时可以重用它们。
1.2 IoProcessor线程 对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小: - IoConnector connector = new NioSocketConnector(9);
- IoAcceptor acceptor = new NioSocketAcceptor(9);
1.3 IoHandler线程 当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下: - acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。 1.4 各种线程的产生 - 当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
- 当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
- 当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
- 如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。
- public class MinaTest {
- protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);
- private static int PORT = 9999;
-
- public static void main(String[] args) {
- try {
-
- 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);
-
- 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();
-
- if ("quit".equals(msg)) {
- session.close();
- }
- Date date = new Date();
- session.write(date.toString());
- }
-
- public void sessionCreated(IoSession session) throws Exception {
- logger.info("服务端与客户端创建连接...");
- }
- }
- NioSccketAcceptor为服务器端监听端口9999通过线程池创建的一个线程。
- NioProcessor-1、NioProcessor-2、NioProcessor-3为IoProcessor线程池创建的线程,用来IO处理。
- pool-3-thread-1、pool-3-thread-2、pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理。
|