如何为Java / Kotlin / Android中的所有请求设置gRPC客户端超时

问题描述

我正在尝试开始将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());