【问题标题】:GRPC Server getting Client cancellationGRPC 服务器获取客户端取消
【发布时间】:2017-09-20 12:15:14
【问题描述】:

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

如果客户端调用 CancelableContext.cancel,视频流停止,但服务器仍在使用 cam 流式传输视频。如果调用取消,服务器会抛出 Transport failed Exception。

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

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 或其他东西?

谢谢

【问题讨论】:

    标签: java server netty grpc grpc-java


    【解决方案1】:

    这可能是一个稍微不同的问题,但对于一个简单的客户端/服务器项目,我需要在客户端方法中添加: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. 
    

    你的堆栈跟踪的其余部分是怎么说的?

    【讨论】:

      【解决方案2】:

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

      import io.grpc.Context;
      { ...
          Context.current().isCancelled()
       ...}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-12
        • 2019-07-02
        • 1970-01-01
        • 2019-11-24
        • 2016-01-27
        • 2015-10-08
        • 2020-09-09
        • 2018-04-12
        相关资源
        最近更新 更多