Как установить тайм-аут клиента gRPC для всех запросов в Java / Kotlin / Android

#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, чтобы сделать его глобальным.