Попытка переписать работающую реактивную функцию, включив небольшую проверку между ними. К сожалению, программа не может выполнить запрос, даже если вычисления выполняются в бэкэнде. Кроме того, было бы здорово, если бы кто-нибудь сказал мне, есть ли какая-то ненужная практика кодирования, связанная с реактивным.
Функция обработчика, откуда мы вызываем реактивную службу
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));}
Обработчик вызывает нижеприведенную службу, ниже приведен фрагмент кода
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"));
}
- рабочая версия сервисного кода.
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();
});
});
}
Не удалось выяснить, почему обработка запроса не заканчивается, пожалуйста, сообщите.