0

我已经为带有 grpc 的网络摄像头流创建了一个微服务。流工作正常,但流的取消仅在客户端有效。

如果客户端调用 CancelableContext.cancel,视频流停止,但服务器仍在使用 cam 流式传输视频。如果调用取消,服务器会抛出一个传输失败异常。

是否可以捕获此异常以在服务器端停止流式传输或其他操作?

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)

我读过这可能是一个错误。

是否可以在服务器端获取 Sessions 或 Connections 或其他东西?

谢谢

4

2 回答 2

0

不确定它是否有帮助。但是,如果调用已被取消,您可以尝试在服务器端轮询 gRPC 上下文并采取相应措施:

import io.grpc.Context;
{ ...
    Context.current().isCancelled()
 ...}
于 2018-07-31T15:29:34.990 回答
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. 

你的堆栈跟踪的其余部分说了什么?

于 2017-04-24T01:48:44.277 回答