java - 即使客户端断开连接,Grpc 服务器也会继续处理数据

标签 java grpc grpc-java

我有一个服务器,它为给定的请求流式传输数据,下面是实现该功能的方法

@Override
public void getChangeFeed(ChangeFeedRequest request, StreamObserver<ChangeFeedResponse> responseObserver) {
    long queryDate = request.getFromDate();
    long offset = request.getPageNo();
    ChangeFeedResponse changeFeedResponse =  processData(responseObserver, queryDate, offset);

    while(true){
        if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
            responseObserver.onNext(changeFeedResponse);
           changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
        }else{
            break;
        }
    }
    responseObserver.onNext(changeFeedResponse);
    responseObserver.onCompleted();
}

当客户端断开连接时,服务器仍然继续处理,当多个客户端正在获取数据时,这可能是个问题。需要知道如何告诉服务器停止处理

最佳答案

有两种相当等价的方法。一种是使用Context,在RPC完成/取消时取消:

while(!Context.current().isCancelled()){ // THIS LINE CHANGED
    if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
        responseObserver.onNext(changeFeedResponse);
       changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
    }else{
        break;
    }
}

另一种是使用 ServerCallStreamObserver:

// THE NEXT TWO LINES CHANGED
ServerCallStreamObserver scso = (ServerCallStreamObserver) responseObserver;
while(!scso.isCancelled()){
    if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
        responseObserver.onNext(changeFeedResponse);
       changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
    }else{
        break;
    }
}

这两种方法都可以在发生取消时提供通知,但在您的情况下轮询是最简单的。

关于java - 即使客户端断开连接,Grpc 服务器也会继续处理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51080221/

相关文章:

java - 需要 java double 才能不向下舍入

java - 从 Ruby 调用一个 Java 方法,该方法采用带有 Ruby BigDecimal 的 Java 原语 double

python - 如何处理多个gRPC future?

java - grpc protobuf java 中的 NoSuchMethodException 和 NoClassDefFoundError

grpc - 如何让 gRPC 服务器和客户端处于同一进程以实现双向通信(不是服务器/客户端流)

java - 为什么Android App无法连接Oracle数据库?

java - 使用简单 XML 序列化 Treemap<String, String>

protocol-buffers - protoc 不生成服务 stub 文件

java - 使用 grpc 服务器拦截器进行嵌套服务器调用

grpc - gRPC服务器如何注意到客户端已取消服务器端流调用?