如何为 Java / Kotlin / Android 中的所有请求设置 gRPC 客户端超时
How to set gRPC Client Timeout for all requests in Java / Kotlin / Android
我正在尝试开始使用 grpc Android。
我找到了如何为单个请求设置超时(截止日期)。
有没有办法为所有请求设置超时?我真的不想在每个请求之前设置截止日期
您可以使用服务配置在 per-method 基础上提供默认值,或者您可以使用拦截器将截止日期设置为 channel-level。
Service config 可以通过 managedChannelBuilder.defaultServiceConfig(Map)
指定。您可以根据不同的方法选择设置不同的超时时间。理想情况下,此配置将由服务所有者管理。
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());
我正在尝试开始使用 grpc Android。
我找到了如何为单个请求设置超时(截止日期)。
有没有办法为所有请求设置超时?我真的不想在每个请求之前设置截止日期
您可以使用服务配置在 per-method 基础上提供默认值,或者您可以使用拦截器将截止日期设置为 channel-level。
Service config 可以通过 managedChannelBuilder.defaultServiceConfig(Map)
指定。您可以根据不同的方法选择设置不同的超时时间。理想情况下,此配置将由服务所有者管理。
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());