ChannelPipeline 接口

大彬大约 1 分钟

ChannelPipeline 接口

每一个新创建的 Channel 都将会被分配一个新的 ChannelPipeline,这项关联是永久性的;Channel 既不能附加另外一个ChannelPipeline,也不能分离其当前的。

ChannelHandlerContext 使得 ChannelHandler 能够和它的 ChannelPipeline 以及其他的 ChannelHandler 交互。

修改ChannelPipeline

ChannelHandler 可以通过添加、删除或者替换其他的ChannelHandler 来实时地修改ChannelPipeline 的布局。

方法描述
addFirst/addBefore/addAfter/addLast将 ChannelHandler 添加到 ChannelPipeline
remove移除
replace替换

ChannelPipeline 的用于访问ChannelHandler 的操作:

方法描述
get返回ChannelHandler
context返回和ChannelHandler绑定的ChannelHandlerContext
names返回所有的ChannelHanlder名称

ChannelHandlerContext 接口

ChannelHandlerContext 代表了ChannelHandler 和ChannelPipeline 之间的关联,每当有ChannelHandler 添加到ChannelPipeline 中时,都会创建ChannelHandlerContext。

方法描述
fireChannelRead触发对下一个ChannelInboundHandler的channelRead()方法的调用
alloc返回相关联的Channel所配置的ByteBufAllocator
bind绑定到给定的SocketAddress,并返回ChannelFuture

异常处理

入站异常:在 ChannelInboundHandler 实现 exceptionCaught 方法。

出站异常:

1.添加ChannelFutureListener 到ChannelFuture

    ChannelFuture future = channel.write(someMessage);
    future.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete (ChannelFuture f){
            if (!f.isSuccess()) {
                f.cause().printStackTrace();
                f.channel().close();
            }
        }
    });

2.添加ChannelFutureListener 到ChannelPromise:

public class OutboundExceptionHandler extends ChannelOutboundHandlerAdapter {
    @Override
    public void write(ChannelHandlerContext ctx, Object msg,
                      ChannelPromise promise) {
        promise.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture f) {
                if (!f.isSuccess()) {
                    f.cause().printStackTrace();
                    f.channel().close();
                }
            }
        });
    }
}
Loading...