让我们假设我有一个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服务正确管理它?
答案 0 :(得分:0)
最简单的方法是将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);
}
即使在发生意外错误的情况下,一定要完成通话也很重要。否则,您将泄漏呼叫(保持打开直到超时发生)。