mina学习

 

1 基于事件驱动架构(SEDA)架构和nio,实现了reactor模式.

seda参见

http://hi.baidu.com/hill007299/blog/item/d738ea0fce7ed8f936d122de.html

2 从ioservice-》filter chain-》handler业务处理,层次分明。支持多种传输层协议TCP、UDP。

mina需要ProtocolCodecFilter,是因为TCP协议只保证字节流的顺序,但是不保证一个发送包对应一个接收包,所以需要ProtocolCodecFilter来识别每个接收包的边界。即应用层的协议,需要应用自己来解析,TCP只负责传输字节流。

完成mina user guide阅读

mina的seda通过ExecutorFilter来实现,需要进一步研究。

http://www.enet.com.cn/article/2007/1019/A20071019875929.shtml

http://blog.sina.com.cn/s/blog_3f77ac270100p3yf.html

默认的ioservice采用了newCachedThreadPool作为线程池,每个IoAcceptor只会通过缓存线程池启动一个Acceptor线程,用于处理连接请求。由org.apache.mina.core.polling.AbstractPollingIoAcceptor.Acceptor.processHandles(Iterator<H>)处理方法,通过同一个线程池启动了一个Processor,这个就反应器模式中的反应器。Acceptor和Processor都是单例,分别占用两个线程。如果不加ExecutorFilter,那么反应器线程Processor和业务处理线程是同一个,反应器的多个io就绪事件会串行处理。也就成了单线程模型,所有的session数据收发事件都在一个线程处理。acceptor.getFilterChain().addLast("executor1", new ExecutorFilter()),加了ExecutorFilter之后,就会在这个过滤器中启用新的线程池执行一个IoEvent线程对象,达到了反应器线程和业务处理线程的解耦。ExecutorFilter默认采用了OrderedThreadPoolExecutor作为线程池,ExecutorFilter是mina的seda架构的核心模块,(You can add any number of ExecutorFilter anywhere in theIoFilterChain to implement any kind of thread model including from a simple thread pool to complex SEDA.,一般加在编码解码器之后,也就是cpu密集型计算之后)。有分析博客如下

http://blog.csdn.net/historyasamirror/article/details/5961368

http://mina.apache.org/configuring-thread-model.html

用filter实现基于步骤,用线程池和事件队列实现事件驱动,用有限长度队列实现队列的吞吐量控制,和不同步骤的通信。这些实现都封装在OrderedThreadPoolExecutor类中,通过OrderedThreadPoolExecutor.execute(Runnable)覆盖了java.util.concurrent.ThreadPoolExecutor.execute(Runnable)。

实现对并发线程数量的控制是通过

org.apache.mina.filter.executor.OrderedThreadPoolExecutor.addWorker(),用户Set<Worker>的size来维护线程数量.

触发服务端写事件是通过flushingSessions队列来实现的,io处理线程不断轮询flushingSessions,如果flushingSessions有待刷的数据,那么执行org.apache.mina.transport.socket.nio.NioProcessor.write(NioSession, IoBuffer, int)操作。

mina io拿到的是byte流,如果要做对象序列化和反序列化,可以通过以下方式实现

 

                ByteArrayInputStream bis = new ByteArrayInputStream(in);

                ObjectInputStream    is  = new ObjectInputStream(bis);

               rv                       = is.readObject();

 

 

mina使用了两个selector来实现反应器模式,一个selector用于执行accept事件,一个selector用于执行read、write事件,总共是两个反应器分别是NioSocketAcceptor+org.apache.mina.core.polling.AbstractPollingIoAcceptor.Acceptor<S, H>,NioProcessor+org.apache.mina.core.polling.AbstractPollingIoProcessor.Processor<S>。

你可能感兴趣的:(框架,seda,网络编程,Mina)