2017-04-23 5 views
0

grpc를 사용하여 웹캠 스트림 용 마이크로 서비스를 만들었습니다. 스트리밍은 잘 작동하지만 스트림의 취소는 클라이언트 측에서만 작동합니다.GRPC 서버에서 클라이언트 취소 받기

클라이언트가 CancellableContext.cancel을 호출하면 비디오 스트리밍이 중지되지만 서버는 여전히 캠을 사용하여 비디오를 스트리밍합니다. 취소가 호출되면 서버는 전송 실패 예외를 발생시킵니다.

스트리밍 또는 서버 측에서 다른 작업을 중지하기 위해이 예외를 catch 할 수 있습니까?

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) 

나는 이것이 버그 일 수 있다고 읽었습니다.

세션 또는 연결 또는 다른 것을 서버 측에서 가져올 수 있습니까?

감사

답변

0

이 약간 다른 문제가 될 수 있지만, 간단한 클라이언트/서버 프로젝트를 위해 내가 추가 할 필요 : 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. 

나머지 스택 트레이스는 무엇을 말합니까?