我在前面的文章中写到,给消息添加各种处理事件,但是这些处理事件是如何关联起来,做到都能够执行,而且会先执行上行的处理方法,然后处理下行的处理方法的。
本文基于netty-3.10.5.Final源码做一个简单的分析。
前面《netty学习04-编写一个简单NIO系统》我们已经分析过服务的启动过程,我们知道在服务启动后,AbstractNioWorker会调用AbstractNioSelector的run方法。
下面看下AbstractNioSelector的run方法,在run方法会有这么一句代码,就是对消息的处理方法。
process方法是个抽象方法,所以我们要看他在AbstractNioWorker的实现。其他细节性的东西先不管,在处理方法中,会有这么一句代码
应该就是处理消息的代码入口了,我们接着进去看看实现。因为他是抽象方法,所以我们要到实现类去看,NioDatagramWorker是UDP处理类,我们要看NioWorker的,里面有如下几行代码要注意。
接着分析fireMessageReceived的实现。
看sendUpstream的实现.
上面有一行代码是DefaultChannelHandlerContext head = getActualUpstreamContext(this.head);进入getActualUpstreamContext的实现类
通过这段代码可以看出,他会先循环遍历上行的处理handler,直到拿到一个,然后返回。然后继续根据原来的处理逻辑走,拿到第一个处理处理handler后,会调用sendUpstream(head, e);再看sendUpstream的源码。
然后我们继续看handleUpstream的实现,这个方法的实现有很多,我们就看下我们之前经常使用的SimpleChannelHandler类下对它的实现。
这个时候通常会调用我们重写的messageRecieved方法
然后如果继续调用sendUpstream,则到如下代码
然后再进去,便可看到
从而调用下一个handler的handleUpstream方法。
这样便能执行完所有上行的handler方法。