当前位置: 首页 > news >正文

乌鲁木齐网站设计要多少钱知名seo公司

乌鲁木齐网站设计要多少钱,知名seo公司,建筑设计有哪些专业,漂亮logo图片在之前的文章中我们看到过ChannelPipeline作为Netty中的数据管道,负责传递Channel中消息的事件传播,事件的传播分为入站和出站两个方向,分别通知ChannelInboundHandler与ChannelOutboundHandler来触发对应事件。这篇文章我们先对Netty中入站事…

在之前的文章中我们看到过ChannelPipeline作为Netty中的数据管道,负责传递Channel中消息的事件传播,事件的传播分为入站和出站两个方向,分别通知ChannelInboundHandler与ChannelOutboundHandler来触发对应事件。这篇文章我们先对Netty中入站事件的传播,也就是ChannelInboundHandler进行下分析:
在这里插入图片描述1、入站事件传播示例

我们通过一个简单的例子看下ChannelPipeline中入站事件channelRead的传播

public class ServerApp {public static void main(String[] args) {EventLoopGroup boss = new NioEventLoopGroup();EventLoopGroup work = new NioEventLoopGroup(2);try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(boss, work).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();// p.addLast(new LoggingHandler(LogLevel.INFO));// 向ChannelPipeline中添加自定义channelHandlerp.addLast(new ServerHandlerA());p.addLast(new ServerHandlerB());p.addLast(new ServerHandlerC());}});bootstrap.bind(8050).sync();} catch (Exception e) {// TODO: handle exception}}}public class ServerHandlerA  extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object object) {System.out.println(this.getClass().getName() + "--"+object.toString());ctx.fireChannelRead(object);}@Overridepublic void channelActive(ChannelHandlerContext ctx) {ctx.channel().pipeline().fireChannelRead("hello word");}}public class ServerHandlerB extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object object) {System.out.println(this.getClass().getName() + "--"+object.toString());ctx.fireChannelRead(object);}
}public class ServerHandlerC extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object object) {System.out.println(this.getClass().getName() + "--"+object.toString());ctx.fireChannelRead(object);}
}

客户端连接服务后可看到输出结果

io.netty.example.echo.my.ServerHandlerA--hello word
io.netty.example.echo.my.ServerHandlerB--hello word
io.netty.example.echo.my.ServerHandlerC--hello word

通过输出结果我们可以看到,消息会根据向ChannelPipeline中添加自定义channelHandler的顺序传递,并通过实现channelRead接口处理消息接收事件的。在例子中channelRead事件的传递是通过ctx.fireChannelRead(object)方法实现,接下来我们就从这里入手看下ChannelPipeline事件传递的具体实现。

2、channelRead事件的传播

首先这里需要注意的是我们例子中第一个节点的传递与实际应用中入站数据的传递是通过ChannelPipeline的fireChannelRead方法实现的,因为在实际的应用中,入站事件的传递是由NioUnsafe的read接口实现发起的,需要保证消息是从head结点开始传递的,例子中是为了模拟这一过程。

 ctx.channel().pipeline().fireChannelRead("hello word");@Overridepublic final ChannelPipeline fireChannelRead(Object msg) {AbstractChannelHandlerContext.invokeChannelRead(head, msg);//默认传入head节点return this;} 

进入invokeChannelRead方法内部看下具体实现;

   static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {//ObjectUtil.checkNotNull 判断传入的消息数据是否为空//next.pipeline.touch 对消息类型进行判断final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);EventExecutor executor = next.executor();//获取ChannelHandlerContext对应的线程if (executor.inEventLoop()) {//是否为当前线程next.invokeChannelRead(m);//调用ChannelHandlerContext中invokeChannelRead的回调方法} else {executor.execute(new Runnable() {//如果线程不是当前线程@Overridepublic void run() {next.invokeChannelRead(m);}});}}

其中invokeChannelRead方法会获取该ChannelHandlerContext所封装的handler实现;

  private void invokeChannelRead(Object msg) {if (invokeHandler()) {try {//获取封装的ChannelInboundHandler实现,并调用我们实现的channelRead方法,((ChannelInboundHandler) handler()).channelRead(this, msg);} catch (Throwable t) {notifyHandlerException(t);}} else {fireChannelRead(msg);}}

前面我们知道首先传入的ChannelPipeline中ChannelHandlerContext链表的head头部节点HeadContext,看下其channelRead的方法实现;

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ctx.fireChannelRead(msg);
}

调用当前ChannelHandlerContext的fireChannelRead方法,进入ctx.fireChannelRead(object)方法内部看下具体的源码实现;

 @Overridepublic ChannelHandlerContext fireChannelRead(final Object msg) {//开始消息传递,findContextInbound方法按顺序获取当前ChannelHandlerContext的next节点invokeChannelRead(findContextInbound(), msg);return this;}

3、资源的释放及SimpleChannelInboundHandler
Netty中对象的生命周期由它们的引用计数管理的,为保证入站对象资源被释放,我们需要通过ReferenceCountUtil.release方法减少引用计数,确保对象的的最终计数器最后被置为0,从而被回收释放。我们看下Netty在入站事件中默认是如何减少引用计数的。
第一种方法,如果我们跟上面示例一样,在实现的每一个ChannelInboundHandler中都调用了ctx.fireChannelRead(msg),最后消息会被传递到Tail尾节点,我们看下Tail节点中的channelRead方法

@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {onUnhandledInboundMessage(msg);}protected void onUnhandledInboundMessage(Object msg) {try {logger.debug("Discarded inbound message {} that reached at the tail of the pipeline. " +"Please check your pipeline configuration.", msg);} finally {ReferenceCountUtil.release(msg);}}

Tail节点的channelRead方法最终会调用ReferenceCountUtil.release方法来减少引用计数的,所以如果你在处理入站消息的过程中没有增加引用并且通过ctx.fireChannelRead(msg)方法把消息传到了Tail节点,你就不需要自己显式调用ReferenceCountUtil.release方法了。

其次如果继承的是SimpleChannelInboundHandler,可以看到SimpleChannelInboundHandler的channelRead方法实现中也已经调用了ReferenceCountUtil.release方法来减少引用计数;

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {boolean release = true;try {if (acceptInboundMessage(msg)) {@SuppressWarnings("unchecked")I imsg = (I) msg;channelRead0(ctx, imsg);} else {release = false;ctx.fireChannelRead(msg);}} finally {if (autoRelease && release) {ReferenceCountUtil.release(msg);}}
}

所以关于入站消息的资源释放方式总结如下:

1、继承ChannelInboundHandlerAdapter ,在channelRead的方法实现中调用ctx.fireChannelRead(object)方法,把消息一直向下传递,直到传递到Tail尾部节点,由Tail节点执行 ReferenceCountUtil.release来减少计数器,保证资源释放;

2、继承SimpleChannelInboundHandler,SimpleChannelInboundHandler本身的ChannelRead方法中会执行 ReferenceCountUtil.release来减少引用;

3、如果以上两点都没有做到,那就需要手动调用ReferenceCountUtil.release来减少引用来释放资源;

我整理了很多关于Java的学习资料和视频,想要的朋友自己领取。Java。到这里我们基本了解了ChannelPipeline中入站事件是如何传播与相应的的,以及Netty中入站消息的资源释放机制。其中如有不足与不正确的地方还望指出与海涵。

http://www.lbrq.cn/news/2706625.html

相关文章:

  • dnf做汉堡怎么玩间网站百度seo优化及推广
  • 潍城区住房和城乡建设局网站网络营销七个步骤
  • java制作的网站专业软文
  • 网站开发app营销培训机构哪家最专业
  • 惠州网站开发公司重庆疫情最新消息
  • 织梦复制网站模板百度客服人工
  • 学校网站建设的作用如何搭建一个网站平台
  • 国家中职示范校建设专题网站佛山百度推广公司
  • 移动网站建站系统下载怎么做一个网站的步骤
  • 中国优秀企业网站优化精灵
  • 做一个网站加优化排名得多少钱软文素材网站
  • 学做烘焙的网站登录百度账号注册
  • 自适应产品网站模板网店推广方案范文
  • 太原网站制作最新招聘信息网络销售工作靠谱吗
  • 东莞企业网站费用小程序源码网
  • 我国市级网站建设分析模板长沙关键词优化公司电话
  • 玉环住房与城乡建设规划局网站成人电脑培训班办公软件
  • 有哪些开发网站公司营销推广平台
  • 谁做的12306网站关键词查询
  • 东莞网站建设制作公司排名成都自动seo
  • 峰峰做网站小游戏推广接单平台
  • 做网站编辑累吗百度点击优化
  • 个人备案的网站可以做宣传广西壮族自治区免费百度推广
  • 安康网站建设百度关键词收录
  • 如何做免费网站推广锦州网站seo
  • 合肥做网站拉新推广怎么快速拉人
  • 做网站的原型 免费网络推广费用大概价格
  • 宝安网站设计制作商务软文写作300字
  • 知名广告公司有哪些东莞百度seo推广公司
  • 外包网站怎么做seo搜索引擎优化的核心及内容
  • 高分辨率PDF压缩技巧:保留可读性的最小体积方案
  • [AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库
  • GitHub宕机时的协作方案
  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • 2025 电赛 C 题完整通关攻略:从单目标定到 2 cm 测距精度的全流程实战
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day3