Сервер GRPC получает отмену клиента

Я создал микросервис для веб-трансляции с помощью grpc. потоковая передача работает нормально, но отмена потока работает только на стороне клиента.

если клиент вызывает CancellableContext.cancel, потоковая передача видео останавливается, но сервер по-прежнему передает видео с камеры. если отмена вызывается, сервер выдает исключение сбоя транспорта.

можно ли перехватить это исключение для остановки потоковой передачи или других операций на стороне сервера?

ClientCall<KameraStreamRequest, KameraStreamResponse> call = (ClientCall) imageStreamBlockingStub.getChannel().newCall(ImageStreamServiceGrpc.METHOD_IMAGE_DATA_STREAM, imageStreamBlockingStub.getCallOptions());
call.sendMessage(KameraStreamRequest.newBuilder().setStreamState(StreamState.STOP).build());

Потоковая передача начинается с простого запроса, который имеет перечисление с State.START. если я вызываю приведенный выше код, чтобы изменить состояние на STOP, я становлюсь исключением:

Exception in thread "main" java.lang.IllegalStateException: Not started
at com.google.common.base.Preconditions.checkState(Preconditions.java:174)
at io.grpc.internal.ClientCallImpl.sendMessage(ClientCallImpl.java:388)
at org.cpm42.grpcservice.ImageStreamClient.cancelStream(ImageStreamClient.java:70)
at org.cpm42.main.StreamClientMainClass.main(StreamClientMainClass.java:21)

Я читал, что это может быть ошибка.

можно ли получить сеансы или подключения или что-то еще на стороне сервера?

Благодарность


person manuel    schedule 23.04.2017    source источник


Ответы (2)


Это может быть немного другая проблема, но для простого проекта клиент / сервер мне нужно было добавить: channel.shutdown().awaitTermination(5, SECONDS); к клиентскому методу, выполняющему запросы, чтобы избавиться от исключения.

io.grpc.netty.NettyServerTransport notifyTerminated
SEVERE: Transport failed
java.io.IOException: An existing connection was forcibly closed by the 
remote host. 

Что говорит остальная часть вашей трассировки стека?

person Kai    schedule 24.04.2017

Не уверен, что это поможет. Но вы можете попробовать на стороне сервера опросить контекст gRPC, если вызов был отменен, и действовать соответственно:

import io.grpc.Context;
{ ...
    Context.current().isCancelled()
 ...}
person Maximilian Schulz    schedule 31.07.2018