文档章节

聊聊dubbo的TimeoutFilter

go4it
 go4it
发布于 06/24 22:56
字数 389
阅读 19
收藏 0

本文主要研究一下dubbo的TimeoutFilter

ListenableFilter

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/ListenableFilter.java

public abstract class ListenableFilter implements Filter {

    protected Listener listener = null;

    public Listener listener() {
        return listener;
    }
}
  • ListenableFilter声明实现Filter接口,它主要定义了listener()方法

TimeoutFilter

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/TimeoutFilter.java

@Activate(group = CommonConstants.PROVIDER)
public class TimeoutFilter extends ListenableFilter {

    private static final Logger logger = LoggerFactory.getLogger(TimeoutFilter.class);

    private static final String TIMEOUT_FILTER_START_TIME = "timeout_filter_start_time";

    public TimeoutFilter() {
        super.listener = new TimeoutListener();
    }

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        invocation.setAttachment(TIMEOUT_FILTER_START_TIME, String.valueOf(System.currentTimeMillis()));
        return invoker.invoke(invocation);
    }

    static class TimeoutListener implements Listener {

        @Override
        public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
            String startAttach = invocation.getAttachment(TIMEOUT_FILTER_START_TIME);
            if (startAttach != null) {
                long elapsed = System.currentTimeMillis() - Long.valueOf(startAttach);
                if (invoker.getUrl() != null && elapsed > invoker.getUrl().getMethodParameter(invocation.getMethodName(), "timeout", Integer.MAX_VALUE)) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("invoke time out. method: " + invocation.getMethodName() + " arguments: " + Arrays.toString(invocation.getArguments()) + " , url is " + invoker.getUrl() + ", invoke elapsed " + elapsed + " ms.");
                    }
                }
            }
        }

        @Override
        public void onError(Throwable t, Invoker<?> invoker, Invocation invocation) {

        }
    }
}
  • TimeoutFilter继承了ListenableFilter,其构造器初始化的listener为TimeoutListener;invoke方法先记录开始执行的时间,之后执行结束时会回调Listener的onResponse或onError方法;TimeoutListener的onResponse会取出timeout_filter_start_time值,如果存在则计算执行耗时,在设置了有效timeout且耗时大于该timeout时,会打印warn日志

小结

TimeoutFilter继承了ListenableFilter,其构造器初始化的listener为TimeoutListener;invoke方法先记录开始执行的时间,之后执行结束时会回调Listener的onResponse或onError方法;TimeoutListener的onResponse会取出timeout_filter_start_time值,如果存在则计算执行耗时,在设置了有效timeout且耗时大于该timeout时,会打印warn日志

doc

© 著作权归作者所有

go4it
粉丝 86
博文 1039
码字总数 994160
作品 0
深圳
私信 提问
Dubbo源码分析(2),Dubbo中采用的设计模式

1、工厂模式 ServiceConfig中有个字段,代码是这样的: Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了jdkspi的机制。这么实现的优点是可扩展性强,想要扩展实现,只需...

郑加威
2018/03/18
0
0
Dubbo的Filter执行顺序分析

最近用到了Dubbo的Filter来做一些监控的东西,顺便整理了一下dubbo中的Filter调用顺序及如何确定的。 服务提供方的过滤器被调用顺序: EchoFilter->ClassLoaderFilter->GenericFilter->Cont...

宸明
2018/01/23
0
0
dubbo源码分析系列——dubbo-rpc-api模块源码分析

简化的类图 该图是经过简化后的rpc-api模块的类图,去除了一些非关键的属性和方法定义,也去除了一些非核心的类和接口,只是一个简化了的的示意图,这样大家能够去除干扰看清楚该模块的核心接...

杨武兵
2016/05/29
739
3
dubbo中的Filter顺序是如何确定的

服务提供方的过滤器被调用顺序: EchoFilter->ClassLoaderFilter->GenericFilter->ContextFilter->(这4个是在代码中指定的) ExceptionFilter-> TimeoutFilter ->MonitorFilter-> TraceFilter......

Jason-ZH
2016/04/17
453
0
【南京站报名中!】微服务框架到生态,Apache Dubbo 开发者沙龙

Dubbo 诞生于 2008 年,是阿里巴巴开源的高性能分布式服务框架(A High Performance Java RPC Framework),使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集...

amber涂南
03/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker 搭建elasticsearch集群

docker 搭建es集群 1、拉去es镜像 docker pull docker.io/elasticsearch:5.6.8 2、 创建挂载目录 mkdir -p /docker/es/configmkdir -p /docker/es/data1mkdir -p /docker/es/data2......

北岩
30分钟前
2
0
Linux检测邮箱是否真实存在方法

例如我们要验证 laiconglin3@126.com 是否真实存在 nslookup -type=MX 126.com 查找126.com 的MX 地址 test@test:~$ nslookup -type=MX 126.comServer:127.0.1.1Address:127.0.1.1#53......

laiconglin
41分钟前
5
0
微人事

微人事是一个前后端分离的人力资源管理系统,项目采用SpringBoot+Vue开发。 lenve/vhr 微人事系统开源啦!

miaojiangmin
42分钟前
1
0
Mongodb 字符串转Date 计算时间间隔

$dateFromString: { dateString: '2019-07-22', timezone: 'Asia/Shanghai'}} 确定好字符串和时区即可 计算时间间隔 $subtract:[{$dateFromString: {dateString: '2019-07-2......

可达鸭Go
44分钟前
4
0
新建Git仓库并添加本地项目

新建Git仓库并添加本地项目 1、在自己的GitHub上创建一个仓库. 2、执行Git命令 1、进入到项目目录并且初始化git git init 2、添加目录下的文件到本地仓库 git add . 3、提交staged的文件...

_Change_
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部