#android #grpc #grpc-java
#Android #grpc #grpc-java
Вопрос:
Я пытаюсь начать использовать grpc для Android.
Я нашел, как установить тайм-аут (крайний срок) для одного запроса.
Есть ли какой-либо способ установить тайм-аут для всех запросов? Я действительно не хочу устанавливать крайний срок перед каждым запросом
Ответ №1:
Вы можете использовать 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());
Комментарии:
1. Я установил TimeoutInterceptor для ManagedChanel, а не для всех заглушек. Спасибо!
2. Знаете ли вы какие-либо реализации request LoggingInterceptor?
3. Если вы используете автоконфигурацию springboot, просто добавьте @GrpcGlobalServerInterceptor, чтобы сделать его глобальным.