Ошибка перехватчика клиентов: полузакрыто без запроса

#grpc #grpc-java

Вопрос:

Я пишу ClientInterceptor для проекта Java, который реализует кэш, чтобы обойти выполнение запроса сервера, если у нас есть ответ в кэше.

Я сильно смоделировал его на основе этого примера в базе grpc-java кода

https://github.com/grpc/grpc-java/blob/master/examples/android/clientcache/app/src/main/java/io/grpc/clientcacheexample/SafeMethodCachingInterceptor.java

Моя реализация соответствует этому

 public void sendMessage(ReqT message) {

  Cache cache = cacheManager.getCache(methodDescriptor.getFullMethodName());
  requestKey = new Key(methodDescriptor.getFullMethodName(), (GeneratedMessageV3) message);
  ValueWrapper cachedResponse = cache.get(requestKey);

  if (Objects.nonNull(cachedResponse)) {
    // already cached
    listener.setPutInCache(false);
    Value responseValue = (Value) cachedResponse.get();
    listener.onMessage(responseValue.response);
    listener.onClose(Status.OK, new Metadata());
    return;
  }

 // not in cache
 listener.setRequestKey(requestKey);
 listener.setPutInCache(true);
 super.sendMessage(message);
}
 

Моя проблема в том, что для каждого кэшированного ответа, который я использую, вместо сообщения grpc_client_status=OK я вместо этого получаю grpc_client_status=Internal сообщение Half-closed without a request . Я предполагаю, что это исходит от сервера, сообщающего нам, что мы начали вызов, но затем закрыли его рано.

Есть ли правильный способ закрыть этот запрос, чтобы сервер не отправил нам это сообщение об ошибке? Прямо сейчас моя статистика клиентов grpc показывает, что подавляющее число наших клиентских запросов не выполняется из-за внутренней ошибки, а не успешно.

Комментарии:

1. Если вы обходите запрос сервера (при обнаружении кэшированного ответа), возникает вопрос о том, что сервер отправляет сообщение об ошибке «полуприкрыто без запроса»? Убедитесь, что вы listener правильно сконструированы.