Grpc Server продолжает обрабатывать данные, даже когда клиент отключен - PullRequest
0 голосов
/ 28 июня 2018

У меня есть сервер, который передает данные для данного запроса ниже, это метод, который выполняет эту функцию

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

Когда клиент отключается, сервер все еще продолжает обрабатывать, это может быть проблемой, когда несколько клиентов выбирают данные. Необходимо знать, как сказать серверу прекратить обработку

1 Ответ

0 голосов
/ 29 июня 2018

Есть два достаточно эквивалентных способа. Одним из них является использование контекста, который отменяется после завершения / отмены 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;
    }
}

Оба подхода могут также предоставлять уведомления при отмене, но опрос в вашем случае проще всего.

...