При реализации вашего сервиса:
@Override
public void data(Empty request, StreamObserver<Data> responseObserver) {
observers.add(responseObserver);
}
Вам необходимо получить Контекст текущего запроса и прослушать для отмены .Для вызовов с одним запросом и несколькими ответами (так называемая потоковая передача на сервере) сгенерированный код gRPC упрощается для прямой передачи запроса.Это означает, что у вас нет прямого доступа к базовому ServerCall.Listener
, как вы обычно слушаете клиентов, отключающихся и отменяющих.
Вместо этого каждому вызову gRPC соответствует Context
, связанный с ним,который несет отмену и другие сигналы в пределах запроса.В вашем случае вам просто нужно прослушать отмену, добавив свой собственный слушатель, который затем безопасно удалит наблюдателя ответа из вашего связанного хеш-набора.
Что касается переподключений: клиенты gRPC будут автоматически переподключаться, если соединение разорвано, но обычно не будут повторять RPC, если это не безопасно.В случае потоковых RPC на сервере это обычно небезопасно, поэтому вам нужно будет повторить попытку RPC на своем клиенте напрямую.