Netty实战读书笔记(第六章)

来源:互联网 发布:白俄罗斯交友软件 编辑:程序博客网 时间:2024/05/17 20:34

Netty channelHandler和channelPipeline。

channelPipeline将channelHandler链接起来做逻辑处理。


channelHandler有四个状态,在handler处理时可更具状态激活不同的方法,比如channelActive对应于channelActive(ChannelHandlerContext  ctx , Object msg)方法。


channelHandler生命周期:


channleHandler有两个子接口,分别用来出站数据处理和入站数据处理的。channelInBoundHandler、channelOutBoundHandler。


Netty资源管理。

public class DiscardOutBoundHandler extends ChannelOutboundHandlerAdapter{@Overridepublic void write(ChannelHandlerContext ctx , Object msg , ChannelPromise promise){ReferenceCountUtil.release(msg);// 释放消息,不传向下一个handler。promise.setSuccess();}}
Netty通过计数法的方式,统计资源,如果一个消息被消费或者被丢弃了,应该调用ReferenceCountUtil.release()释放掉这个资源。

channelPipeline:

channelHandlerContext在channelPipeLine中流动,channelHandler对context进行处理。

import static io.netty.channel.DummyChannelPipeline.DUMMY_INSTANCE;import io.netty.channel.ChannelHandlerAdapter;import io.netty.channel.ChannelPipeline;public class ModifyChannelPipeline {private static final ChannelPipeline CHANNEL_PIPELINE_FROM_SOMEWHERE = DUMMY_INSTANCE;public void modifyPipeline(){ChannelPipeline channel = CHANNEL_PIPELINE_FROM_SOMEWHERE ;channel.addLast("handler1" , new FirstChannel());channel.addLast("handler2" , new SecondChannel());channel.addLast("handler3" , new ThreadChannel());channel.remove("handler3");}public static class FirstChannel extends ChannelHandlerAdapter{}public static class SecondChannel extends ChannelHandlerAdapter{}public static class ThreadChannel extends ChannelHandlerAdapter{}}
ChannelHandlerContext:
ChannelHandlerContext提供了channel和pipeline之间的连接,加入一个channelhandler,就会有一个channelhandlercontext与之对应。


import io.netty.buffer.Unpooled;import io.netty.channel.Channel;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelPipeline;import io.netty.channel.DummyChannelPipeline;import io.netty.util.CharsetUtil;public class WriteHandlers {    private static final ChannelHandlerContext CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE = DUMMY_INSTANCE;    private static final ChannelPipeline CHANNEL_PIPELINE_FROM_SOMEWHERE = DummyChannelPipeline.DUMMY_INSTANCE;        /**     * 通过ChannelHandlerContext访问channel     */    public void accessChannel(){        ChannelHandlerContext handlerContext = this.CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE;    Channel channel = handlerContext.channel();    channel.write(Unpooled.copiedBuffer("okkk" , CharsetUtil.UTF_8));    }        /**     * 通过channelHandlercontext访问channelPipeline。     */    public void accessChannelPipeline(){    ChannelHandlerContext handlerContext = this.CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE;    ChannelPipeline channelPipe = handlerContext.pipeline();        channelPipe.write(Unpooled.copiedBuffer("ok" , CharsetUtil.UTF_8));    }}


原创粉丝点击