您现在的位置是:首页 > 正文

netty设计模式-责任链模式

2024-02-01 01:10:22阅读 2

责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

首先来看看责任链模式的四个要素:

1、责任处理器接口

2、创建链,添加删除责任处理器接口

3、上下文

4、责任链终止机制。

在netty里面,很明显channelHandler和Pipeline构成了责任链模式。让我们通过上面的要素,一个一个分析

 

1、首先是责任处理器接口:

ChannelHandler就是责任处理器接口,ChannelInboundHandler、ChannelOuntboundHandler是它的两个增强。

 

2、找到创建链,添加删除责任处理器接口ChannelPipeline:

里面有各种add和remove的方法

 

3、然后是上下文ChannelHandlerContext:

public interface ChannelHandlerContext extends AttributeMap, ChannelInboundInvoker, ChannelOutboundInvoker {

    /**
     * Return the {@link Channel} which is bound to the {@link ChannelHandlerContext}.
     */
    Channel channel();

    /**
     * Returns the {@link EventExecutor} which is used to execute an arbitrary task.
     */
    EventExecutor executor();

    ...
}

里面有两个最重要的方法,一个返回绑定的channel,一个返回executor来执行任务。

 

4、最后我们看责任链终止机制

现在我们自定义一个InBoundHandlerC

public class InBoundHandlerC extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("InBoundHandlerC: " + msg);
        ctx.fireChannelRead(msg);
    }
}

ctx.fiteChannelRead方法就是为了把责任传递下去。如果注释掉了,消息就不会传递。另外如果不重写channelRead方法,默认会传递,让我们查看ChannelInboundHandlerAdapter的channelRead方法:

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ctx.fireChannelRead(msg);
    }

默认会传递。这里另外提一句,java里面的很多filter,是否继续向下传递,都是return true还是return 方法来实现的。

 

最后,消息是如何一步步向下传递的呢,让我们看AbstractChannelHandlerContext的fireChannelRead方法:

    @Override
    public ChannelHandlerContext fireChannelRead(final Object msg) {
        invokeChannelRead(findContextInbound(), msg);
        return this;
    }

继续点击findContextInbound(),可以看到:

    private AbstractChannelHandlerContext findContextInbound() {
        AbstractChannelHandlerContext ctx = this;
        do {
            ctx = ctx.next;
        } while (!ctx.inbound);
        return ctx;
    }

也就是,这里是不停地指向下一个对象实现的。

网站文章

  • 根据二叉树的中序和后续遍历,求树的前序遍历(附Java代码实现)

    根据二叉树的中序和后续遍历,求树的前序遍历(附Java代码实现)

    根据树的中序遍历和后续遍历求前序遍历

    2024-02-01 01:09:52
  • 目标检测网络系列——YOLO V4

    YOLO4的设计目标也还是YOLO系列的主要关注点,就是要快。 The main goal of this work is designing a fast operating speed of an...

    2024-02-01 01:09:46
  • 如何不优雅的解决子组件丢失this.props的三个重要对象

    如何不优雅的解决子组件丢失this.props的三个重要对象

    把父组件的this.props暴力传给子组件在组件里就不能用this.props了 要用this.props.data 才相当于this.props然后就可以正常用这三个对象的属性和方法了 

    2024-02-01 01:09:39
  • SpringMVC(五):异常处理器

    作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行。工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)业务层抛出的异...

    2024-02-01 01:09:11
  • 力扣232 - 用栈实现队列【C语言实现】

    力扣232 - 用栈实现队列【C语言实现】

    力扣232 - 用栈实现队列,教你如何使用双栈实现队列操作

    2024-02-01 01:09:04
  • 友元函数练习

    #include "stdafx.h" #include"iostream" using namespace std; class Date; class Ti...

    2024-02-01 01:08:57
  • SIMD指令初学 热门推荐

    SIMD指令初学 热门推荐

    参考自:http://blog.csdn.net/gengshenghong/article/details/7008704(。。。。) SIMD 即 single instruction multiple data,单指令流多数据流,也就是说一次运算指令可以执行多个数据流,这样在很多时候可以提高程序的运算速度。 SIMD是CPU实现DLP(Data Level Para

    2024-02-01 01:08:28
  • 23种设计模式——命令模式

    23种设计模式——命令模式

    命令模式实质:封装请求

    2024-02-01 01:08:21
  • SpringSecurity(前后端分离版)[3]-授权

    SpringSecurity(前后端分离版)[3]-授权

    例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。SpringSecurity为我们提供了基于注解的权限控制方案,这...

    2024-02-01 01:08:13
  • log4j2漏洞检测和利用

    log4j2漏洞检测和利用

    漏洞检测使用的是BP插件,插件地址。JNDI注入工具,工具地址 https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0,命令如下:将以下命令进行base64编码,IP替换为你攻击机IP。使用工具命令如下:burp发包:反弹shell成功:

    2024-02-01 01:08:06