dubbo filter链构建过程

    public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
        if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
            return protocol.export(invoker);
        }
        return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
    }

    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
        if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
            return protocol.refer(type, url);
        }
        return buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER);
    }

    public void destroy() {
        protocol.destroy();
    }

    private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
        Invoker<T> last = invoker;
        List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
        if (filters.size() > 0) {
            for (int i = filters.size() - 1; i >= 0; i --) {
                final Filter filter = filters.get(i);
                final Invoker<T> next = last;
                last = new Invoker<T>() {

                    public Class<T> getInterface() {
                        return invoker.getInterface();
                    }

                    public URL getUrl() {
                        return invoker.getUrl();
                    }

                    public boolean isAvailable() {
                        return invoker.isAvailable();
                    }

                    public Result invoke(Invocation invocation) throws RpcException {
                        return filter.invoke(next, invocation);
                    }

                    public void destroy() {
                        invoker.destroy();
                    }

                    @Override
                    public String toString() {
                        return invoker.toString();
                    }
                };
            }
        }
        return last;
    }

  

时间: 2024-08-06 09:05:47

dubbo filter链构建过程的相关文章

ubuntu下stm32交叉工具链 构建过程1

说实话,这个过程将是十分折腾的过程,而且不一定成功,所以,我的很多朋友在听到我说要做这件事情的时候,都给我泼冷水. 但是,我还是想努力,因为这次我是下决心,非要反微软到底. 就算这个过程再难——我脑海里经常闪现起 勇敢的心 里 华伦士 最后受尽极性 仍然高喊 自由的情景. 我对自己说,也是激励自己:只有这样的人才有权利追求和获得自由. 这件事,难就难在我发现我光是为了获取一个可用的gcc编译器,在codesourcery codebench上下载下来都这么费劲. 我的网络速度相当快,但不知为什么

一步一步跟我学习lucene(7)---lucene搜索之IndexSearcher构建过程

最近一直在写一步一步跟我学习lucene系列(http://blog.csdn.net/wuyinggui10000/article/category/3173543),个人的博客也收到了很多的访问量,谢谢大家的关注,这也是对我个人的一个激励,O(∩_∩)O哈哈~,个人感觉在博客的编写过程中自己收获了很多,我会一直继续下去,在工作的过程中自己也会写出更多类似系列的博客,也算是对自己只是的一种积累: IndexSearcher 搜索引擎的构建分为索引内容和查询索引两个大方面,这里要介绍的是luce

【龙书笔记】编译器简介及程序构建过程综述

备注:本文是近期重新阅读编译器经典教材<Compilers Principles, Techniques, & Tools>一书(又称DragonBook,龙书)的其中一篇读书笔记. 1. 什么是编译器 从本质来看,平时提到的"编程语言"其实都是一些助记符,用于向其他人或机器描述我们想要完成的逻辑运算.这些易于人类理解的语言想要被计算机理解并正确执行,就必须被转换成机器码,而完成这一转换过程的软件系统就是编译器. 简言之,编译器其实也是一个计算机程序,它可以读取用一

DOM 操作成本究竟有多高,HTML、CSS构建过程 ,从什么方向出发避免重绘重排)

前言: 2019年!我准备好了 正文:从我接触前端到现在,一直听到的一句话:操作DOM的成本很高,不要轻易去操作DOM.尤其是React.vue等MV*框架的出现,数据驱动视图的模式越发深入人心,jQuery时代提供的强大便利地操作DOM的API在前端工程里用的越来越少.刨根问底,这里说的成本,到底高在哪儿呢? 什么是DOM Document Object Model 文档对象模型 什么是DOM?可能很多人第一反应就是div.p.span等html标签(至少我是),但要知道,DOM是Model,

项目构建之maven篇:2.HelloWorld项目构建过程

文件结构说明: 项目构建生命周期: 清理 编译 测试 打包 运行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的build.xml类似 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

Maven学习总结(二)——Maven项目构建过程练习

Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----------java | ----------resources | -----test | ---------java | -----

Saiku3.1构建过程(暂时不包含Saiku-UI)

1.首先下载Saiku3.1的源码:https://github.com/OSBI/saiku/tree/release-3.1 2.以maven项目方式导入到eclipse中(此步骤可以不做) 3.修改下载的根目录中的pom文件,找到build节点-->pluginManagement节点-->plugins中添加如下代码 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId

Camel路由构建过程

个人认为Camel中最重要的两大块,一是路由的构建过程,二是路由构建完成后的执行过程. 下面就参数前面的Camel示例来说说路由的构建细节. 其实这里说的路由构建其实是构建路由定义,对应Camel中的RouteDefinition类,一个RouteDefinition对象规定了或者说指定了一个消息从哪里产生,中间要经过什么样的处理,最后路由到什么地方.RouteDefinition有点类似java中的Class类,包含的都是一个元信息,外界则是参照这些元信息进行工作.RouteDefinitio

redis集群构建过程 linux windows

redis集群的构建过程 本人初次构建redis集群时,通过查阅资料整理的文档 目录 Linux Redis cluster集群方案... 1 Windows redis集群方案... 5 Linux Redis cluster集群方案 1 安装: 下载地址:http://download.redis.io/releases/ 下载版本:redis3.0.7.tar.gz [[email protected] soft]$ tar -zxzf redis-3.0.7.tar.gz [[email