首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从客户端干净地关闭GRPC-Java中所有打开的流

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

Stack Overflow用户
提问于 2017-04-14 15:33:39
回答 2查看 7.7K关注 0票数 9

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

与客户端断开连接

代码语言:javascript
复制
while (!channel.awaitTermination(3, TimeUnit.SECONDS)) {
// check for upper bound and break if so
}
channel.shutdown().awaitTermination(3, TimeUnit.SECONDS);

服务器上的错误

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-05-29 07:23:45

如果要从客户端关闭gRPC (服务器端或bi-di)流,则必须使用包io.grpc中的Context.CancellableContext附加rpc调用。

假设您有一个rpc:

代码语言:javascript
复制
service Messaging {
    rpc Listen (ListenRequest) returns (stream Message) {}
}

在客户端,您将这样处理它:

代码语言:javascript
复制
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()将模拟错误,“取消”,连接将被关闭,您的StreamObserver<Message> messageStreamonError将以可抛出的消息调用:“取消”。

票数 7
EN

Stack Overflow用户

发布于 2017-04-17 21:03:20

如果您使用shutdownNow(),它将更积极地关闭您拥有的RPC流。另外,在调用shutdown()shutdownNow()之前,需要调用awaitTermination()

也就是说,一个更好的解决方案是在关闭通道之前优雅地结束所有的RPC。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43414695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档