Mina-写异步实现

摘要

异步Io是Mina等网络的框架的重要功能,它大大降低了用户操作网络IO的复杂度,这其中由于TCP的协议特点,通过TCP发送数据的异步实现更是尤为重要,本文就简述一下Mina写异步的代码实现。

发送数据时的代码流程

调用session.write() -> 调用session中的filterChain.fireFilterWrite(WriteRequest) -> 从TailFilter一直到HeadFilter,在HeadFilter中调用processor.write方法 -> AbstractPollingIoProcessor.write:将session列入flushingSession当中,随后的IO线程将发送flushingSession中session的WriteRequestQueue所有WriteRequest。

WriteFuture

因为是异步操作,所以Future是必不可少的,Mina提供了WriteFuture作为WriteRequest发送成功后的通知。WriteFuture被组合在WriteRequest当中,并在调用session.write()时返回。
DefaultWriteFuture -> DefaultIoFuture

WriteFuture阻塞:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public IoFuture await() throws InterruptedException {
synchronized (lock) {
while (!ready) {
waiters++;
try {
// Wait for a notify, or if no notify is called,
// assume that we have a deadlock and exit the
// loop to check for a potential deadlock.
lock.wait(DEAD_LOCK_CHECK_INTERVAL);
} finally {
waiters--;
if (!ready) {
checkDeadLock();
}
}
}
}
return this;
}

当IO线程将WriteRequest发送完成时,调用filterChain的fireMessageSent(),唤醒等待的线程。
WriteFuture释放:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void setValue(Object newValue) {
synchronized (lock) {
// Allow only once.
if (ready) {
return;
}
result = newValue;
ready = true;
if (waiters > 0) {
lock.notifyAll();
}
}
notifyListeners();
}