Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何管理GRPCJava服务器方法中的阻塞代码?_Java_Grpc_Grpc Java - Fatal编程技术网

如何管理GRPCJava服务器方法中的阻塞代码?

如何管理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(

假设我有一个grpc java服务器,其代码如下:

@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任务设置另一个池。您的grpc
getData
方法是流式调用吗?gRCP流式调用被设计为长寿命的,因此您可以只调用
onCompleted()
完成长时间运行的阻塞任务后。您不必创建新线程,因为每次RPC调用时,都会创建一个新线程(由gRPC在后台处理)@AnonymousAngelo默认情况下,grpc workers使用CachedThreadPool,这在高负载下是浪费的。这就是为什么我要为workers设置fixedThreadPool,并为blocking-I/O任务设置另一个池。