从IoSession调用write的过程:
IoSession.write(object message)
真正实现这个方法的是AbstractIoSession
1、创建writeFuture对象,用于异步操作的返回
2、将传入的Object对象,包装成WriteRequest对象,交给IoFilterChain去处理。
3、核心的实现就是这些代码:
// Now, we can write the message. First, create a future
WriteFuture writeFuture = new DefaultWriteFuture(this);
WriteRequest writeRequest = new DefaultWriteRequest(message, writeFuture, remoteAddress);
// Then, get the chain and inject the WriteRequest into it
IoFilterChain filterChain = getFilterChain();
filterChain.fireFilterWrite(writeRequest);
//.....
return writeFuture;
下面看IoFilterChain是怎么处理的?
首先,IoFilterChain是用一个双向列表来保存它所包含的所有filter的,大概的结构如下:
head <-> filter1 <-> filter2 <-> ..... <-> filterN <-> tail
其中head和tail是两个固有、内置、特殊的filter,主要是衔接和过渡的功能。如tail就是负责调用IoHandler的功能。
回到IoFilterChain怎么处理write的话题。
4、IoFilterChain从列表中找到tail,从tail开始查找filter,顺序调用每个filter的filterWrite()方法
典型实现:
public void fireFilterWrite(WriteRequest writeRequest) {
Entry tail = this.tail;
callPreviousFilterWrite(tail, session, writeRequest);
}
private void callPreviousFilterWrite(Entry entry, IoSession session,
WriteRequest writeRequest) {
try {
IoFilter filter = entry.getFilter();
NextFilter nextFilter = entry.getNextFilter();
filter.filterWrite(nextFilter, session, writeRequest);
} catch (Throwable e) {
writeRequest.getFuture().setException(e);
fireExceptionCaught(e);
}
}
5、最后必然就掉到head这个filter的filterWrite,它的实现应该有些特殊,才能把消息发送给IoProcessor
将消息放入发送队列中,然后调用IoProcessor flush出去。
public void filterWrite(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) throws Exception {
AbstractIoSession s = (AbstractIoSession) session;
s.getWriteRequestQueue().offer(s, writeRequest);
if (!s.isWriteSuspended()) {
s.getProcessor().flush(s);
}
}
WriteRequestQueue的默认实现就是java.util.concurrent.ConcurrentLinkedQueue,舍去传入的session对象。
在看processor怎么flush出去之前,先备忘下面的东西。
NOTE1:在这个filter传递过程中,IoSession一直被传递下去:
filterWrite(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest)
NOTE2:其实head这个filter就只实现了两个方法,也就是它只关心这两个操作:
private class HeadFilter extends IoFilterAdapter {
@SuppressWarnings("unchecked")
@Override
public void filterWrite(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) throws Exception { }
@SuppressWarnings("unchecked")
@Override
public void filterClose(NextFilter nextFilter, IoSession session)
throws Exception { }
}
6、IoProcessor是怎么处理的?
IoProcessor的flush方法在AbstractPollingIoProcessor类中实现。
它将传入的session对象加入到flushingSessions列表,
然后调用processor内在的selector.wakeUp (java.nio.channels.Selector),
而在AbstractPollingIoProcessor类中独立运行的Processor线程,就回从select()等待中被唤醒。
7、AbstractPollingIoProcessor.Processor线程
被唤醒之后,从flushingSessions中取出session对象,再从session中取出WriteRequest对象
如果WriteRequest对象是IoBuffer类型的,则:
if (buf.remaining() <= length) {
return session.getChannel().write(buf.buf());
}
如果WriteRequest对象是File对象,则:
region.getFileChannel().transferTo(
region.getPosition(), length, session.getChannel());
region是FileRegion对象。就是将文件内容传输到session的Channel上去。
【这部分省略了很多细节,具体了解细节的话,主要看AbstractPollingIoProcessor类和NioProcessor类】
8、自此,才将数据真正发送到网络上去。
分享到:
相关推荐
在这个场景中,我们关注的是MINA的核心组件以及两个特定的过滤器和传输组件:`mina-core-2.0.0-RC1.jar`、`mina-filter-compression-2.0.0-RC1.jar`和`mina-transport-apr-2.0.0-RC1.jar`。 **MINA Core (mina-core...
mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...
mina-core-2.0.0-RC1-sources.jar
mina-core-2.0.0-M1-sources.jar是构建mina框架的主要文件
mina-filter-compression-2.0.7.jar,mina 过滤器jar包,核心包之一
2. **分析源码**:通过阅读MINA的源码,了解其内部处理流程,如读写事件的处理、过滤器链的工作方式等。 3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **...
mina-integration-ognl-2.0.0-M4.jar mina-integration-ognl-2.0.0-M4.jar
mina-core-2.0.0-M1.jar/mina-example-1.0.5.jar/slf4j-jdk14-1.6.1.jar/slf4j-log4j12-1.6.1.jar mina 所用jar
《mina-core-2.0.0-M1.jar与SLF4J:构建高效网络通信与日志记录》 mina-core-2.0.0-M1.jar是Apache Mina项目的核心库,它是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端和客户端应用程序。...
《mina-core-2.0.0-RC1:Apache MINA框架的核心组件解析》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展的网络应用开发框架,主要用于构建高性能、高可用性的网络服务器...
"mina-pull-down-refresh-master.zip"这个压缩包提供的解决方案,旨在完美解决这一难题。 1. 微信小程序ScrollView概述: 微信小程序中的ScrollView组件是用于展示可滚动内容的容器,可以垂直或水平滚动。它支持...
mina-transport-apr-2.0.2.jar
mina-integration-beans-2.0.0-M4.jar mina-integration-beans-2.0.0-M4.jar
mina-core-2.0.0-M6.jar
mina-statemachine-2.0.7.jar提供了状态机的支持,使得开发者能够以声明式的方式定义和管理对象的状态转换,这在处理网络协议或者业务逻辑流程时非常有用。 mina-integration-beans-2.0.7.jar和mina-integration-...
标题中的"Apache-Mina-2.rar"和"mina-mina-core-1.1.3"表明这是关于Apache Mina 2.x版本,特别是其核心模块的1.1.3版本。 Apache Mina的名称来源于"Multi-purpose Infrastructure for Network Applications",它...
mina-core-2.0.0-RC1.jar
mina-filter-compression-2.0.2.jar
《mina-http-2.0.7.jar:Java中的MINA框架与HTTP支持详解》 MINA(Multipurpose Infrastructure for Network Applications)是一个强大的网络应用程序框架,它由Apache软件基金会开发,主要用于构建高性能、高效率...
Mina-2.0.0-M1-api