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


Netty channelHandler和channelPipeline。

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


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


channelHandler生命周期:


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


Netty资源管理。

public class DiscardOutBoundHandler extends ChannelOutboundHandlerAdapter{
	
	@Override
	public 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));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值