Trying to rewrite a working reactive function by including a small validation in between. Unfortunately, the program is not able to complete the request even though the computation is completed in the backend. Also, It will be great if someone can tell me if there is any unnecessary coding practice related to reactive.
Handler function, from where we invoke the reactive service
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));}
Handler invokes the below service, the below code snippet is having issue
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")); }
- working version of the service code.
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();
});
});
}
Not able to figure out why the request processing is not ending, kindly advise.