码迷,mamicode.com
首页 > 其他好文 > 详细

ChannelHandler原理

时间:2014-06-24 23:40:24      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:channelhandlercontex   defaultchannelhandle   channelhandler   


1.创建ChannelPipeline的方法是实现接口 ChannelPipelineFactory 中的那个 getPipeline() 方法,然后根据自己的业务需要加入相应的 ChannelHandler。
bubuko.com,布布扣
 
2. 
bubuko.com,布布扣

接口 ChannelHandlerContext 提供的功能是统一管理这些ChannelHandler,使其能够和这个ChannelPipeline及其他Handler进行交互,一个handler可以往上流或者下流发送一个ChannelEvent,动态修改其所属的Channelpipeline。
充当链表节点的 DefaultChannelHandlerContext 里面的重要成员有: 链表指针next , prev, 以及是否能够处理downStream,upStream事件的布尔变量。

private final class DefaultChannelHandlerContext implements ChannelHandlerContext {
    volatile DefaultChannelHandlerContext next;
    volatile DefaultChannelHandlerContext prev;
    private final String name ;
    private final ChannelHandler handler;
    private final boolean canHandleUpstream ;
    private final boolean canHandleDownstream ;
    private volatile Object attachment ;

    DefaultChannelHandlerContext(
            DefaultChannelHandlerContext prev, DefaultChannelHandlerContext next,
            String name, ChannelHandler handler) {

        if (name == null) {
            throw new NullPointerException( "name");
        }
        if (handler == null) {
            throw new NullPointerException( "handler");
        }
        canHandleUpstream = handler instanceof ChannelUpstreamHandler;
        canHandleDownstream = handler instanceof ChannelDownstreamHandler;


        if (!canHandleUpstream && ! canHandleDownstream) {
            throw new IllegalArgumentException(
                    "handler must be either " +
                    ChannelUpstreamHandler. class.getName() + " or " +
                    ChannelDownstreamHandler. class.getName() + ‘.‘);
        }

        this .prev = prev;
        this .next = next;
        this .name = name;
        this .handler = handler;
    }

    public Channel getChannel() {
        return getPipeline().getChannel();
    }

    public ChannelPipeline getPipeline() {
        return DefaultChannelPipeline. this ;
    }

    public boolean canHandleDownstream() {
        return canHandleDownstream ;
    }

    public boolean canHandleUpstream() {
        return canHandleUpstream ;
    }

    public ChannelHandler getHandler() {
        return handler ;
    }

    public String getName() {
        return name ;
    }

    public Object getAttachment() {
        return attachment ;
    }

    public void setAttachment(Object attachment) {
        this .attachment = attachment;
    }

    public void sendDownstream(ChannelEvent e) {
        DefaultChannelHandlerContext prev = getActualDownstreamContext( this. prev);
        if (prev == null) {
            try {
                getSink().eventSunk( DefaultChannelPipeline. this, e);
            } catch (Throwable t) {
                notifyHandlerException(e, t);
            }
        } else {
            DefaultChannelPipeline. this.sendDownstream(prev, e);
        }
    }

    public void sendUpstream(ChannelEvent e) {
        DefaultChannelHandlerContext next = getActualUpstreamContext( this. next);
        if (next != null) {
            DefaultChannelPipeline. this.sendUpstream(next, e);
        }
    }
}






ChannelHandler原理,布布扣,bubuko.com

ChannelHandler原理

标签:channelhandlercontex   defaultchannelhandle   channelhandler   

原文地址:http://blog.csdn.net/vonzhoufz/article/details/34081361

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!