Netty 源码分析系列(四)ChannelHandler

这是我参加8月更文应战的第8天,活动详情查看:8月更文应战

前言

先简略了解一下ChannelPipelineChannelHandler的概念。

愿望一个流水线车间。当组件从流水线头部进入,穿越流水线,流水线上的工人按次序对组件进行加工,抵达流水线尾部时商品组装结束。可以将ChannelPipeline作为流水线,ChannelHandler作为流水线工人。源头的组件作为event,如read,write等等。

本篇文章我们先来讲讲ChannelHandler的相关知识,下面进入正文吧。

正文

ChannelHandler

  • Chan源码编辑器nelHandler并不处理作业,而由其子类代为处理:ChannelInboundHandler阻拦和源码精灵处理入站作业,ChannelOutboundHandler阻拦和处理出站作业。
  • ChannelHandlerChannelHandlerContext经过组合或继承的办法相关到一缓存是什么意思同成对使用。作业经过ChannelHandlerContext自动调用如fireXXX()write(msg)等办法,将作业传达到下一个处理器。

源码网站:入源码买卖网站源码站作业在ChannelPipeline双向链表中由头到链表头插法尾正向传达,出站作业则方向相反。

ChannaleHandler 作为最顶层的接口,并不处理入站和出站作业,所以接口中只包含最基本的办法:

// Handler本身被添加到ChannelPipeline时调用
void handlerAdded(ChannelHandlerContext var1) throws Exception;
 //源码编辑器手机版下载 Handler本身被从ChannelPipeline中删去时调用
void handle源码时代rRemoved(ChannelHandlerContext var1) throws Exception;
​
// 产生失常时调用
@Deprecated
void exceptionCaught(Channe缓存视频在手机哪里找lHandlerContext va链表和数组的差异r1, Throwable var2) th链表回转rows Exception;

Sharable注解:

当客户端联接到服务器缓存视频在手机哪里找服务器租用,Netty新建一个ChannelPipeline处理其间的作业,而一个Chan服务器是什么ne服务器宕机lPipeline中含缓存有若干ChannelHandler。假定每个客户端联接都新建一个ChannelHandler实例,当有许多客户端时,服务器将保存链表和数组的差异许多的Channel链表查询Handler实例。为此,Netty供应了Sharable注解,假定一个ChannelHandler状况无关,那么可将其标明为Sharable,如此,服务器只需保存一个实例就能处理一切客户端的作业。

@Inherited
@Documented
@Target({ElementType.T缓存视频兼并app下载YPE})
@Retention(RetentionPolicy.R缓存的视频怎么保存到本地UNTIME)
public @interface Sharable {
}

作为ChannelHandler的默许结束,ChannelHandlerAdapter有个重要的办法isSharable(),代码如下:

public boolean isSharable() {
  Cl缓存ass<?> clazz = this.getClass();
  // 每个线程一个缓存
  Map<Class<?>, Boolean> cache = InternalThreadL源码精灵ocalMap.get().handlerSharableCache();
  Boolean sharable = (Boole链表回转an)cache.get(cl缓存视频兼并azz);
  if (sharable == null) {
    // H线程和进程的差异是什么andler是否存在Sharable注解
    sharable = cla缓存视频在手机哪里找zz.isAnnotationPresent(Sharable.class服务器宕机);
    cache.put(clazz, sharable);
   }
​
  re源码是什么意思tur源码之家n sharable;
}

这儿引入了优化的源码网站线程局部变量InternalThreadLocalMap,即每个线程都有一份ChannelHandler是否S链表回转harable缓存的视频怎么保存到本地缓存。这样可以削减线程间的竞赛,进步功能源码本钱

ChannelInboundHandler

ChannelInboundHandler处理入站数据以及各种状况改动,当Channel状况产生改动会调用ChannelInboundHandler中的一些生命周期办法。这些办法与Channel的生命密切相关。

入站数据,便是进入socket的数据。下面展示一些该接口的生命周期API:

Netty 源码剖析系列(四)ChannelHandler

ChannelInboundHandlerAdapter作为ChannelInboundHandler的结束,默许将入站作业自动传达到下一个入站处理器。其间的缓存代码高度一致,如下:

public void channelRe源码本钱ad(ChannelHandlerCo线程优化开不开ntext ctx源码是什么意思, Object msg) throws Exception {
  ctx.fireChannelRead(msg);
}

ChannelOutboundHandler

出站操作和数据将由 ChannelOutboundHandler 处理。它的办法将被 Channel、 ChannelPipeline 以及 ChannelHandlerContext 调用。 ChannelOutboundHandler 的一个强健的线程池创建的四种功用是可以按需推延操作或许作业,这使得可以经过一些杂乱的办法来处理恳求。源码精灵

例如, 假定到长途节点的写入被暂停了, 那么你可以推延冲刷操作并在稍后持续。

Netty 源码剖析系列(四)ChannelHandler

同理,ChannelOutb线程和进程的差异是什么oundHandlerAdapter作为C线程hanne线程池面试题lOutboundHandler的作业,默许将出站作业传达到下一个出站处理器:

@Override
pu服务器和电脑主机的差异blic void read(ChannelHandlerContext ctx) throws Exception {
  ctx.read();
}

ChannelDuplexHandler

ChannelDuplexHandler则一同结束了ChannelInbo缓存的视频怎么保存到本地undHandlerChannelOutboundHandler接口。假定一个所需的ChannelHandler既要链表回转处理入站作业又要处理出站作业,引荐继承此类。

总结

以上便是关于ChannelHandler的剖析,相信你对ChannelHandler也有一定的了解,下期我们再来剖析ChannelPipeline的源码。

发表评论

提供最优质的资源集合

立即查看 了解详情