簡單介紹:MINA框架是對java的NIO包的一個封裝,簡化了NIO程序開發的難度,封裝了很多底層的細節,然開發者把精力集中到業務邏輯上來,最近做了一個相關的項目,為了備忘對MINA做一個總結。
下面這個start方法用來初始化MINA:
- private void start(int port, WebContext ctx)
- throws IOException, InstantiationException
- , IllegalAccessException, ClassNotFoundException {
-
- NioSocketAcceptor acceptor = new NioSocketAcceptor(5);
-
- java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);
-
- acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
- acceptor.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
- LoggingFilter filter = new LoggingFilter();
- filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
- filter.setMessageReceivedLogLevel(LogLevel.DEBUG);
- filter.setMessageSentLogLevel(LogLevel.DEBUG);
- filter.setSessionClosedLogLevel(LogLevel.DEBUG);
- filter.setSessionCreatedLogLevel(LogLevel.DEBUG);
- filter.setSessionIdleLogLevel(LogLevel.DEBUG);
- filter.setSessionOpenedLogLevel(LogLevel.DEBUG);
- acceptor.getFilterChain().addLast("logger", filter);
-
- acceptor.setReuseAddress(true);
-
- acceptor.getSessionConfig().setReuseAddress(true);
- acceptor.getSessionConfig().setReceiveBufferSize(1024);
- acceptor.getSessionConfig().setSendBufferSize(10240);
-
- acceptor.getSessionConfig().setTcpNoDelay(true);
-
- acceptor.setBacklog(100);
- acceptor.setDefaultLocalAddress(new InetSocketAddress(port));
-
- acceptor.setHandler(new WebHandler());
- acceptor.bind();
- }
NioSocketAcceptor是MINA的適配器,一切都是從這里開始的。MINA中有個過濾器和處理器的概念,過濾器用來過濾數據,處理器用來處理數據。具體來說MINA的處理模型就是request->過濾器A->過濾器B->處理器->過濾器B->過濾器A->response,這里的request和response類似serlvet的request和response。
- acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
-
- acceptor.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));
-
-
現在詳細描述一下request->WebDecoder->WebHandler->WebEncode->response的過程:
客戶端發送一個請求到MINA服務器,這里相當于來了一個requet。請求首先來到
- WebDecoder類(實現了ProtocolDecoder接口)中的
- boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法
-
-
-
-
-
-
-
-
-
-
然后到
- WebHandler(擴展了IoHandlerAdapter抽象類)中的
- void messageReceived(IoSession session, Object message) throws Exception{}方法
- WriteFuture future = session.write(response);
- future.addListener(IoFutureListener.CLOSE);
- IoFutureListener里面有個operationComplete(IoFuture future)方法,當流發送完成之后才調用這個方法。
-
-
-
-
-
-
然后到
- WebEncoder類(實現了ProtocolEncoder接口)中的
- boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{}
- 方法
-
-
-
-
-
-
-