1、ctx.write()与ctx.channel().write()的区别
ctx.write()方法在调用的时候,根据ChannelPipeline的放置顺序,写出去数据只经过在它之前的ChannelPipeline,而ctx.channel().write()方法则会通过完整的ChannelPipeline。
以通过IdleState发送心跳包为例子,当触发IdleState事件的时候,事件往后传递,到userEventTriggered()处进行事件处理,并以此为起点,反序向前运行。
ctx.write()方法在 IdleStateHandler()方法里调用,消息没有经过Encoder就直接发送出去,很可能造成消息接收失败,或者是无法解析等问题。
ctx.channel().write()方法则会按顺序经过每一个ChannelOutboundHandler
2、关于 IdleStateHandler()方法的使用
IdleStateHandler()的状态会触发userEventTriggered()方法,但前提是userEventTriggered()方法必须
在
IdleStateHandler()的后面,这关系到channelpipeline的顺序,当 IdleStateHandler()事件触发了以后,消息会一直往后走,如图所示:
图中IdleStateHandler()位于pipeline的最后一位,触发事件以后消息一直往后传递,却没有userEventTriggered()方
法对消息进行处理,
IdleStateHandler()事件就不能生效了。
正常的使用方式是这样的。