繁体   English   中英

如何在gRPC-java服务器方法中管理阻塞代码?

[英]How can I manage blocking code inside gRPC-java server method?

假设我有一台grpc-java服务器,其代码如下所示:

@Override
public void getData(RequestValue requestValue, StreamObserver<ResponseValue>responseObserver) {
   ResponseValue rv = ... // blocking code here
   responseObserver.onNext(rv);
   responseObserver.onCompleted();
}

因此,由于阻塞了代码(来自数据库或其他服务的数据),我得到了responseValue。

我想避免使用另一个线程池来阻塞我的当前线程。 例如,在Netty中,我可以将特定的EventExecutorGroup用于此类任务。

如何使用grpc-java服务正确管理它?

最简单的方法是将responseObserver传递给长时间运行的任务:

@Override
public void getData(RequestValue requestValue, StreamObserver<ResponseValue> responseObserver) {
    Runnable r = () -> {
        try {
            ResponseValue rv = ... // blocking code here
            responseObserver.onNext(rv);
            responseObserver.onCompleted();
        } catch (Exception e) {
            responseObserver.onError(e);
    }
    executor.schedule(r);
}

即使发生意外错误,一定要完成呼叫也很重要。 否则,您将泄漏呼叫(保持打开直到超时发生,如果有的话)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM