[英]Closing all open streams in GRPC-Java from client end cleanly
我正在使用GRPC-Java 1.1.2。 在活动的GRPC会话中,我打开了一些双向流。 当客户端断开连接时,有没有办法从客户端清除它们? 当我尝试断开连接时,我运行以下外观固定次数然后断开但我可以在服务器端看到以下错误(不确定它是否由另一个问题引起):
与客户断开连接
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(服务器端或双向)流,则必须使用程序包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<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()
将模拟错误'CANCELED',连接将被关闭,并且StreamObserver<Message> messageStream
onError
将使用throwable消息调用:'CANCELED'。
如果使用shutdownNow()
,它将更积极地关闭您拥有的RPC流。 此外,您需要在调用awaitTermination()
之前调用shutdown()
或shutdownNow()
awaitTermination()
。
也就是说,更好的解决方案是在关闭频道之前优雅地结束所有RPC。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.