apache mina作为一个网络应用框架,经常被用作消息系统中,也就是说经常要去处理IO,因此要实现高效的写和读。
最近又看了看写的处理,始终发现不能完全的理解他的处理思路。
涉及的类
先看一下写操作中涉及的类。
分析过程
从最底下的AbstractPollingIoProcessor.flush来分析
在mina的处理流程中,当Processor接受到可以写可以读的Sessions后,会将他们加入到flush队列,而
AbstractPollingIoProcessor.flush就是flush的具体实现。
AbstractPollingIoProcessor.flush的大致流程如下:
do
从flushSessions队列中取出session
判断session的状态,如果是OPENED,那么进行flushNow处理;
如果是关闭状态,那么就跳过;
如果是打开中,那么就加入到flushSessions队列中。
while(flushSessions队列不为空)
上述流程中对于每个session的flush处理主要的过程是这样:
flushNow:
final boolean hasFragmentation = session.getTransportMetadata().hasFragmentation();
final WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue();
// Set limitation for the number of written bytes for read-write
// fairness. I used maxReadBufferSize * 3 / 2, which yields best
// performance in my experience while not breaking fairness much.
final int maxWrittenBytes = session.getConfig().getMaxReadBufferSize()
+ (session.getConfig().getMaxReadBufferSize() >>> 1);
int writtenBytes = 0;
WriteRequest req