问题描述
我正在尝试开始将grpc用于Android。
我发现了如何为单个请求设置超时(最后期限)。
是否可以为所有请求设置超时?我真的不想在每个请求之前都设置截止日期
解决方法
您可以使用service config逐个方法提供默认值,也可以使用拦截器在渠道级设置截止日期。
可以通过managedChannelBuilder.defaultServiceConfig(Map)
指定Service config。您可以选择根据不同的方法设置不同的超时时间。理想情况下,此配置应由服务所有者管理。
Map<String,Object> wildcardConfig = new HashMap<>();
wildcardConfig.put("name",Collections.singletonList(
// This would specify a service+method if you wanted
// different methods to have different settings
Collections.emptyMap()));
wildcardConfig.put("timeout","10s");
channelBuilder.defaultServiceConfig(
Collections.singletonMap("methodConfig",Collections.singletonList(
wildcardConfig)));
拦截器可以通过stub.withInterceptors()
添加到存根中。创建一个将添加默认超时的拦截器,如下所示:
class TimeoutInterceptor implements ClientInterceptor {
@Override public <ReqT,RespT> ClientCall<ReqT,RespT> interceptCall(
MethodDescriptor<ReqT,RespT> method,CallOptions callOptions,Channel next) {
callOptions = callOptions.withDeadlineAfter(10,TimeUnit.SECONDS);
return next.newCall(method,callOptions);
}
}
stub = stub.withInterceptors(new TimeoutInterceptor());