如何管理GRPCJava服务器方法中的阻塞代码?
假设我有一个grpc java服务器,其代码如下:如何管理GRPCJava服务器方法中的阻塞代码?,java,grpc,grpc-java,Java,Grpc,Grpc Java,假设我有一个grpc java服务器,其代码如下: @Override public void getData(RequestValue requestValue, StreamObserver<ResponseValue>responseObserver) { ResponseValue rv = ... // blocking code here responseObserver.onNext(rv); responseObserver.onCompleted(
@Override
public void getData(RequestValue requestValue, StreamObserver<ResponseValue>responseObserver) {
ResponseValue rv = ... // blocking code here
responseObserver.onNext(rv);
responseObserver.onCompleted();
}
@覆盖
public void getData(RequestValue RequestValue、streamobserver responseobserver){
ResponseValue rv=…//此处阻塞代码
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);
}
@覆盖
public void getData(RequestValue RequestValue,StreamObserver responseObserver){
可运行r=()->{
试一试{
ResponseValue rv=…//此处阻塞代码
responseObserver.onNext(rv);
responseObserver.onCompleted();
}捕获(例外e){
响应观察者onError(e);
}
执行人。附表(r);
}
即使发生意外错误,您也必须在某个时间完成调用。否则,您将泄漏调用(在超时发生之前保持打开状态,如果有)。最简单的方法是将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);
}
@覆盖
public void getData(RequestValue RequestValue,StreamObserver responseObserver){
可运行r=()->{
试一试{
ResponseValue rv=…//此处阻塞代码
responseObserver.onNext(rv);
responseObserver.onCompleted();
}捕获(例外e){
响应观察者onError(e);
}
执行人。附表(r);
}
即使发生意外错误,您也必须在某个时间完成调用。否则,您将泄漏调用(在超时发生之前保持打开状态,如果有的话).该死,为什么我没有想到这个解决方案?!谢谢你。该死,为什么我没有想到这个解决方案?!谢谢你。你的gRPC
getData
方法是流式调用吗?gRCP流式调用被设计为长寿命的,因此你可以只调用onCompleted()
完成长时间运行的阻塞任务后。您不必创建新线程,因为每次RPC调用时,都会创建一个新线程(由gRPC在后台处理)@AnonymousAngelo默认情况下,grpc workers使用CachedThreadPool,这在高负载下是浪费的。这就是为什么我要为workers设置fixedThreadPool,并为blocking-I/O任务设置另一个池。您的grpcgetData
方法是流式调用吗?gRCP流式调用被设计为长寿命的,因此您可以只调用onCompleted()
完成长时间运行的阻塞任务后。您不必创建新线程,因为每次RPC调用时,都会创建一个新线程(由gRPC在后台处理)@AnonymousAngelo默认情况下,grpc workers使用CachedThreadPool,这在高负载下是浪费的。这就是为什么我要为workers设置fixedThreadPool,并为blocking-I/O任务设置另一个池。