当前位置:首页 > 开发 > 编程语言 > 网络编程 > 正文

Netty源码学习-DefaultChannelPipeline

发表于: 2013-11-27   作者:bylijinnan   来源:转载   浏览:
摘要: package com.ljn.channel; /** * ChannelPipeline采用的是Intercepting Filter 模式 * 但由于用到两个双向链表和内部类,这个模式看起来不是那么明显,需要仔细查看调用过程才发现 * * 下面对ChannelPipeline作一个模拟,只模拟关键代码: */ public class Pipeline {
package com.ljn.channel;

/**
 * ChannelPipeline采用的是Intercepting Filter 模式
 * 但由于用到两个双向链表和内部类,这个模式看起来不是那么明显,需要仔细查看调用过程才发现
 * 
 * 下面对ChannelPipeline作一个模拟,只模拟关键代码:
 */
public class Pipeline {
    
    //netty里面为了能处理Upstream和Downstream,采用的是双向链表;
    //现在只关注Upstream的处理,因此单向链表就可以了
    private  DefaultHandlerContext head;
    //private  DefaultHandlerContext tail;  
    
    public static void main(String[] args) {
        Pipeline pipeline= new Pipeline();
        pipeline.addLast(new ClientSimpleHandlerA());
        pipeline.addLast(new ClientSimpleHandlerB());
        
        String event = "";
        pipeline.sendUpstream(event);
    }
    
    private void sendUpstream(String event) {
        HandlerContext ctx = head;
        if (ctx != null) {
            sendUpstream(ctx, event);
        }
    }

    //调用Handler的入口。但是否继续调用下一个Handler,取决于Handler的handleUpstream方法是否调用ctx.sendUpstream
    //把HandlerContext传递给handleUpstream方法,以便接口回调
    public void sendUpstream(HandlerContext ctx, String event) {
        ((DefaultHandlerContext)ctx).getHandler().handleUpstream(ctx, event);
    }
    
    private class DefaultHandlerContext implements HandlerContext {
        
        //HandlerContext pre;     //双向链表。现在我们只关注一个方向
        HandlerContext next;
        Handler handler;
        
        
        //这里体现了Intercepting Filter中的next调用
        @Override
        public void sendUpstream(String event) {
            HandlerContext next = this.next;
            if (next != null) {
                Pipeline.this.sendUpstream(next, event);    //调用的是外部类的方法
            }
        }
        
        public Handler getHandler() {
            return handler;
        }
        
        public void setHandler(Handler handler) {
            this.handler = handler;
        }
        
        /*
         * omit other getter/setter
         */
    }
    
    public void addLast(Handler handler) {
        DefaultHandlerContext ctx = new DefaultHandlerContext();
        ctx.setHandler(handler);
        if (head == null) {
            head = ctx;
        } else {
            head.next = ctx;
        }
    }
    
}


interface Handler {
    void handleUpstream(HandlerContext ctx, String event);
}

 interface HandlerContext {
     void sendUpstream(String event);
}
 
class ClientSimpleHandlerA implements Handler {

    @Override
    public void handleUpstream(HandlerContext ctx, String event) {
        System.out.println("ClientSimpleHandlerA");
        ctx.sendUpstream(event);    // 继续调用下一个Handler
    }
     
 }

class ClientSimpleHandlerB implements Handler {
    
    @Override
    public void handleUpstream(HandlerContext ctx, String event) {
        System.out.println("ClientSimpleHandlerB");
        //ctx.sendUpstream(event);    //假设到了这里处理就结束了,不调用下一个Handler
    }
    
}

Netty源码学习-DefaultChannelPipeline

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
背景 最忌工作中接触到Netty相关应用场景,之前看过mima的部分源码,所以最近看了Netty的部分源码和
类结构图: 不了解Executor接口原理的可以查看concurrent包中的api介绍,这里只介绍Netty中EventExe
Transport API的核心: Channel接口 类图表示Channel含有Pipeline和Config接口,pipeline上一节有所
Netty是一个基于JAVA NIO类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、
先看下netty的channel对象关联关系。channel是由channelfactory来创建的,channelfactory又分为clie
感谢网友【黄亿华】投递本稿。 上一篇文章我们概要介绍了Netty的原理及结构,下面几篇文章我们开始
上一篇文章我们概要介绍了Netty的原理及结构,下面几篇文章我们开始对Netty的各个模块进行比较详细
netty里面最重要的应该是ChannelHandler,这个里面也是用户编程直接打交道的接口,也是串行于Channe
本文采用版本为Jboss Netty-3.2.4.Final,Jboss Netty示例example、几十页的user guide是快速学习的
本文为原创,转载请注明出处 netty 4源码分析-write Netty的写操作由两个步骤组成: Write:将msg存
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号