Netty·Handler 执行顺序

作者 : jamin 本文共1464个字,预计阅读时间需要4分钟 发布时间: 2020-10-18 共1073人阅读

Handler 执行顺序

ChannelInboundHandler 和 ChannelOutboundHandler

ChannelHandler 有两个子类 ChannelInboundHandlerChannelOutboundHandler,这两个类对应了两个数据流向,如果数据是从外部流入应用程序,就看做是 inbound,相反便是 outbound。一个 ChannelHandler 处理完接收到的数据会传给下一个 Handler,或者什么不处理,直接传递给下一个。

一个 ChannelPipeline 可以把 ChannelInboundHandlerChannelOutboundHandler 混合在一起,当一个数据流进入 ChannelPipeline 时,它会从管道头部开始传给第一个 ChannelInboundHandler,当第一个处理完后再传给下一个,一直传递到管道的尾部。与之相对应的是,当数据被写出时,它会从管道的尾部开始,先经过管道尾部的最后一个 ChannelOutboundHandler,当它处理完成后会传递给前一个 ChannelOutboundHandler

channelpipeline

数据在各个 Handler 之间传递,这需要调用方法中传递的 ChanneHandlerContext 来操作,在 netty 的 API 中提供了两个基类分 ChannelInboundHandlerAdapterChannelOutboundHandlerAdapter,他们仅仅实现了调用 ChanneHandlerContext 来把消息传递给下一个 Handler,因为我们只关心处理数据,因此在程序中可以继承这两个基类,而我们仅需实现处理数据的部分即可。

ChannelInboundHandlerChannelOutboundHandlerChannelPipeline 中是混合在一起的,那么它们如何区分彼此呢?其实很容易,因为它们各自实现的是不同的接口,对于 inbound event,Netty 会自动跳过 ChannelOutboundHandler,相反若是 outbound eventChannelInboundHandler 会被忽略掉。

当一个 ChannelHandler 被加入到 ChannelPipeline 中时,它便会获得一个 ChannelHandlerContext 的引用,而 ChannelHandlerContext 可以用来读写 Netty 中的数据流。因此,现在可以有两种方式来发送数据:

  1. 把数据直接写入 Channel
  2. 把数据写入 ChannelHandlerContext

它们的区别是写入 Channel 的话,数据流会从 Channel 的头开始传递,而如果写入 ChannelHandlerContext 的话,数据流会流入管道中的下一个 Handler。

总结

  1. ChannelInboundHandler 之间的传递,通过调用 ctx.fireChannelRead(msg) 实现;调用 ctx.write(msg) 将传递到 ChannelOutboundHandler
  2. ctx.write() 方法执行后,需要调用 flush() 方法才能令它立即执行。
  3. ChannelOutboundHandler 在注册的时候需要放在最后一个 ChannelInboundHandler 之前,否则将无法传递到 ChannelOutboundHandler流水线 pipeline 中 outhander 不能放到最后,否则不生效)。
  4. Handler 的消费处理放在最后一个处理。

参考文章:
Handler 的执行顺序

本站所提供的部分资源来自于网络,版权争议与本站无关,版权归原创者所有!仅限用于学习和研究目的,不得将上述内容资源用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源。如果上述内容资对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。本站不保证所提供下载的资源的准确性、安全性和完整性,源码仅供下载学习之用!如用于商业或者非法用途,与本站无关,一切后果请用户自负!本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。如有侵权、不妥之处,请联系站长以便删除!
金点网络 » Netty·Handler 执行顺序

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
是否提供免费更新服务?
持续更新,永久免费
是否经过安全检测?
安全无毒,放心食用

提供最优质的资源集合

立即加入 友好社区
×