gRPC StatusRuntimeException:已取消:在双向流服务中已取消

时间:2018-09-13 15:18:22

标签: android grpc

我正在创建Android应用程序,该应用程序正在使用gRPC与服务器通信。我的服务方法很少。使用简单的rpc方法进行通信没有问题,但是bidirectional streaming有问题。

我收到一条消息ServerToClient,此后出现错误: io.grpc.StatusRuntimeException: CANCELLED: Cancelled

这是我的服务:

service CommunicationGateway {
    [...]
    rpc CommunicationChannel(stream ClientToServer) returns (stream ServerToClient) {}
}

这是我使用ManagedChannel和存根创建OkHttp的方式:

this.channel = OkHttpChannelBuilder.forAddress(ip, port)
        .useTransportSecurity()
        .connectionSpec(ConnectionSpec.MODERN_TLS)
        .sslSocketFactory(buildSslContext().socketFactory)
        .keepAliveWithoutCalls(true)
        .build()
this.asyncStub = CommunicationGatewayGrpc.newStub(this.channel)

这是我要开始流式传输的代码:

val clientToServerRequest = asyncStub.communicationChannel(object : StreamObserver<Messages.ServerToClient> {
    override fun onNext(value: Messages.ServerToClient) {
        info("communicationChannel onNext $value")
    }
    override fun onError(t: Throwable) {
        t.printStackTrace()
    }
    override fun onCompleted() {
        info("communicationChannel onCompleted")
    }
})

我的应用程序(客户端)还是服务器端出现此问题?或者我该如何检查?

2 个答案:

答案 0 :(得分:0)

您描述的状态描述可能不完整。可能应该是(是的,包含换行符):

Cancelled
Rst Stream

假设它是由现代版本的gRPC-Java和基于OkHttp的传输在客户端生成的。

如果是这种情况,则服务器/代理会取消RPC。客户端上没有更多信息。

如果您正在使用服务器端代理,则可能是在超时后终止了流。检查您代理的配置。

答案 1 :(得分:0)

事实证明,这是服务器端的问题