Spring Reactive: вызов метода службы не может вернуть ответ - PullRequest
0 голосов
/ 12 февраля 2020

Попытка переписать работающую реактивную функцию, включив небольшую проверку между ними. К сожалению, программа не может выполнить запрос, даже если вычисления выполняются в бэкэнде. Кроме того, было бы здорово, если бы кто-нибудь сказал мне, есть ли какая-то ненужная практика кодирования, связанная с реактивным.

  1. Функция обработчика, откуда мы вызываем реактивную службу

        public Mono<ServerResponse> performValidation(ServerRequest serverRequest) {
        Mono<Request> request = serverRequest.bodyToMono(Request.class);
        return ServerResponse.ok()
                .body(service1.performValidation(boundaryCheckRequest, ""), ServiceResponse.class)
                //.body(service1.performValidation_Working(boundaryCheckRequest, ""), ServiceResponse.class)
                .onErrorResume(Exception.class,
                        e -> ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR)
                                .body(Mono.just(e.getMessage()), String.class));}
    
  2. Обработчик вызывает нижеприведенную службу, ниже приведен фрагмент кода

    public Mono<ServiceResponse> performValidation(Mono<ServiceRequest> requestMono,String token) {
        return Mono.create(monoSink -> {
            requestMono.map(triggerRequest -> {
                return checkValidOrders(triggerRequest)?doValidations(requestMono,token).subscribe():Mono.just(new ServiceResponse()).subscribe();
            }).subscribe();
        });
    }
    
    private Mono<ServiceResponse> doValidations(ServiceRequest request,String token){
        RequestHolder requestHolder= new RequestHolder(request,token);
        ServiceResponseObject serviceBus=new ServiceResponseObject();
        return Mono.create(monoSink -> {
            Flux.merge(
                    getServiceOne(requestHolder, serviceBus),
                    getServiceTwo(requestHolder, serviceBus)
                  )
                    .doOnNext(completedFlag -> {
                    })
                    .doOnComplete(() -> {
                        ServiceResponse ServiceResponse = validationService.validate(serviceBus, requestHolder.getRequest());
                        monoSink.success(ServiceResponse);
                    })
                    .doOnError(throwable -> {
                        monoSink.success(handleError(throwable, requestHolder));
                    })
                    .subscribe();
        });
    }
      private Boolean checkValidOrders(ServiceRequest tr){
        return tr.getLines().stream().anyMatch(line-> !line.getStatus().equals("ACIVE"));
    }   
    
  3. рабочая версия сервисного кода.
    public Mono<ServiceResponse> performValidation_Working(Mono<ServiceRequest> requestMono,String token) {
        return Mono.create(monoSink -> {
            requestMono.map((triggerReq)->
            {
                return new RequestHolder(request,token);
            })
            .subscribe(servicesRequestHolder -> {
                ServiceResponseObject serviceBus=new ServiceResponseObject();
                Flux.merge(
                        getServiceOne(requestHolder, serviceBus),
                        getServiceTwo(requestHolder, serviceBus)
                )
                    .doOnNext(completedFlag -> { })
                    .doOnComplete(()->{
                        ServiceResponse ServiceResponse = validationService.validate(serviceBus, requestHolder.getRequest());
                        monoSink.success(ServiceResponse);
                    })
                    .doOnError(throwable -> {
                        monoSink.success(handleError(throwable,servicesRequestHolder));
                    })
                    .subscribe();
            });
        });
    } 

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

...