即使客户端断开连接,Grpc Server也会继续处理数据 [英] Grpc Server keeps processing the data even when client get disconnected

查看:487
本文介绍了即使客户端断开连接,Grpc Server也会继续处理数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a server which streams the data for a given request below is the method which does that function

@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();
}

当客户端断开连接时,服务器仍继续处理,当多个客户端获取数据时,可能会出现此问题.需要知道如何告诉服务器停止处理

When the client get disconnected the server still keeps on processing, this might be issue when multiple clients are fetching the data. Need to know how to tell server to stop processing

推荐答案

有两种相当等效的方法.一种是使用上下文,当RPC完成/取消后,上下文将被取消:

There's two fairly-equivalent ways. One is to use the Context, which is cancelled when the RPC is completed/cancelled:

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 other would be to use the 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;
    }
}

这两种方法也都可以在发生取消时提供通知,但对于您而言,轮询是最简单的.

Both approaches can also provide notification when a cancellation occurs, but polling is easiest in your case.

这篇关于即使客户端断开连接,Grpc Server也会继续处理数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆