@Override
    public void handleScanRequest(final ScanRequest request,
                                  final RequestProcessClosure<BaseRequest, BaseResponse<?>> closure) {
        final ScanResponse response = new ScanResponse();
        response.setRegionId(getRegionId());
        response.setRegionEpoch(getRegionEpoch());
        try {
            KVParameterRequires.requireSameEpoch(request, getRegionEpoch());
            final BaseKVStoreClosure kvStoreClosure = new BaseKVStoreClosure() {

                @SuppressWarnings("unchecked")
                @Override
                public void run(final Status status) {
                    if (status.isOk()) {
                        response.setValue((List<KVEntry>) getData());
                    } else {
                        setFailure(request, response, status, getError());
                    }
                    closure.sendResponse(response);
                }
            };
            if (request.isReverse()) {
                this.rawKVStore.reverseScan(request.getStartKey(), request.getEndKey(), request.getLimit(),
                    request.isReadOnlySafe(), request.isReturnValue(), kvStoreClosure);
            } else {
                this.rawKVStore.scan(request.getStartKey(), request.getEndKey(), request.getLimit(),
                    request.isReadOnlySafe(), request.isReturnValue(), kvStoreClosure);
            }
        } catch (final Throwable t) {
            LOG.error("Failed to handle: {}, {}.", request, StackTraceUtil.stackTrace(t));
            response.setError(Errors.forException(t));
            closure.sendResponse(response);
        }
    }
Rhea KV region RPC request processing service.

@author jiachun.fjc
jraft-rheakv/rheakv-core/src/main/java/com/alipay/sofa/jraft/rhea/DefaultRegionKVService.java