过滤器(五)之TimeoutFilter
本文基于 Dubbo 2.6.1 版本,望知悉。
1. 概述
本文分享过滤器 TimeoutFilter ,用于服务提供者中。
2. TimeoutFilter
com.alibaba.dubbo.rpc.filter.TimeoutFilter ,实现 Filter 接口,超时过滤器。如果服务调用超时,记录告警日志,不干涉服务的运行。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Activate(group = Constants.PROVIDER)
public class TimeoutFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(TimeoutFilter.class);
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
long start = System.currentTimeMillis();
// 服务调用
Result result = invoker.invoke(invocation);
// 计算调用时长
long elapsed = System.currentTimeMillis() - start;
// 超过时长,打印告警日志
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.");
}
}
return result;
}
}
- 第 10 行:调用 Invoker#invoke(invocation) 方法,服务调用。
- 第 12 行:计算调用时长。
- 第 13 至 21 行:超过时长,打印告警提供者消费者 日志。注意,此处的 “timeout” 取得的是服务 的配置,不同于服务 的配置。
- 第 22 行:返回调用结果。
- 再注意,在服务提供者超过了超时时间消费者 ,执行服务调用时,即使 ,也不会取消执行。虽然,服务 ,已经结束调用,返回调用超时。
本文由作者按照 CC BY 4.0 进行授权