Как прервать потоковую передачу gRPC при ошибке и указать ошибку в C ++ - PullRequest
0 голосов
/ 31 января 2019

Я отправляю синхронный поток сообщений gRPC от клиента, написанного на C ++, в следующей последовательности:

  • Получение unique_ptr для ClientWriter
  • Вызов его записи () метод с сообщениями столько раз, сколько необходимо.
  • вызовите его метод WritesDone ()
  • вызовите Finish () для получения статуса сервера.

Как бы япрервать эту последовательность в случае ошибки на стороне клиента и указать это на сервере?

1 Ответ

0 голосов
/ 06 февраля 2019

Вам необходимо выполнить client_context.TryCancel (), а затем Finish ().В https://github.com/grpc/grpc/blob/master/test/cpp/end2end/end2end_test.cc, ClientCancelsRequestStream есть несколько примеров.Я адаптировал его так, чтобы он был ближе к вашему коду.

RequestType request;
ResponseType response;
ClientContext context;
request.set_message("hello");

auto client_writer = stub_->YourRPC(&context, &response);
client_writer->Write(request);
client_writer->Write(request);

client_context.TryCancel();

Status s = client_writer->Finish();

Если ваша отмена прошла успешно, s.error_code () == grpc :: StatusCode :: CANCELED.

Вот комментарийиз ClientContext :: TryCancel () в client_context.h в репозитории grpc:

/// Send a best-effort out-of-band cancel on the call associated with
/// this client context.  The call could be in any stage; e.g., if it is
/// already finished, it may still return success.
///
/// There is no guarantee the call will be cancelled.
...