java - 从客户端干净地关闭 GRPC-Java 中的所有打开流

标签 java grpc grpc-java

我正在使用 GRPC-Java 1.1.2。在 Activity 的 GRPC session 中,我打开了一些双向流。当客户端断开连接时,有没有办法从客户端清除它们?当我尝试断开连接时,我运行以下查找固定次数,然后断开连接,但我可以在服务器端看到以下错误(但不确定是否由其他问题引起):

断开与客户端的连接

while (!channel.awaitTermination(3, TimeUnit.SECONDS)) {
// check for upper bound and break if so
}
channel.shutdown().awaitTermination(3, TimeUnit.SECONDS);

服务器错误

E0414 11:26:48.787276000 140735121084416 ssl_transport_security.c:439] SSL_read returned 0 unexpectedly.
E0414 11:26:48.787345000 140735121084416 secure_endpoint.c:185]        Decryption error: TSI_INTERNAL_ERROR

最佳答案

如果您想从客户端关闭 gRPC(服务器端或 bi-di)流,您必须将 rpc 调用附加到 Context.CancellableContext在包中找到 io.grpc .

假设你有一个rpc:

service Messaging {
    rpc Listen (ListenRequest) returns (stream Message) {}
}

在客户端,你会这样处理:

public class Messaging {
    private Context.CancellableContext mListenContext;

    private MessagingGrpc.MessagingStub getMessagingAsyncStub() {
    /* return your async stub */
    }

    public void listen(final ListenRequest listenRequest, final StreamObserver<Message> messageStream) {

        Runnable listenRunnable = new Runnable() {
            @Override
            public void run() {
                Messaging.this.getMessagingAsyncStub().listen(listenRequest, messageStream);
            }

        if (mListenContext != null && !mListenContext.isCancelled()) {
            Log.d(TAG, "listen: already listening");
            return;
        }

        mListenContext = Context.current().withCancellation();
        mListenContext.run(listenRunnable);
    }

    public void cancelListen() {
        if (mListenContext != null) {
            mListenContext.cancel(null);
            mListenContext = null;
        }
    }
}

调用 cancelListen()将模拟错误“CANCELLED”,连接将关闭,并且 onError你的StreamObserver<Message> messageStream将使用可抛出的消息调用:'CANCELLED'。

关于java - 从客户端干净地关闭 GRPC-Java 中的所有打开流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43414695/

相关文章:

Java grpc 运行时错误

java - 在 Java 中将 gRPC 服务绑定(bind)到 localhost

grpc - grpc 流媒体可以持续多久

java - 需要帮助将 java.stream 转换为列表

go - "go get google.golang.org/grpc"失败 : unrecognized import path

java - 从 Firebase 检索数据并将其打印出来

go - 如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的

go - 如何将 http.Request 包装到 proto 文件中

java - 按单选按钮两次,计算两次

java - Spring Repository 删除规范