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

假设你有一个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 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()将模拟错误,’CANCELED’,连接将关闭,以及StreamObserver的onError< Message>将使用throwable消息调用messageStream:’CANCELED’.

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐