简体   繁体   中英

Spring webflux not running reactive call

I have the following methods.

@Transactional
        public Mono<Long> processPollResult(final PollReport pollReport, final String xmlResult,
                final String ref, final String clientId, int orgId) {
            return pollOrderRepository.save(toNewOrphanPollOrder(clientId, orgId)).flatMap(pollOder -> {
                List<Mono<?>> monoPubs = new ArrayList<>();
                monoPubs.add(pollOrderOrphanRepository.save(toPollOrderOrphan(pollOder.getPollOrderId())));
                labReport.getLabResults().getLabResultList().forEach(labResult -> {
                    monoPubs.add((Mono<?>) saveOrphanPollOrderResult(ref, clientId, pollOder, pollResult).subscribe());
                });
    
                List<Polls> polls = buildAcknowledgePoll(ref, clientId);
                return Mono.when(monoPubs).then(deviceService.acknowledgePolls(polls, clientId)).thenReturn(pollOder.getPollOrderId());
            });
        }
    
        private Mono<Long> saveOrphanPollOrderResult(final String ref, final String clientId, PollOrder pollOder,
                PollResult pollResult) {
            return pollOrderTestRepository.save(toPollOrderTest(pollOrder, pollResult.getPollResultHeader()))
                    .flatMap(pollOrderTestRes -> {
                        if (pollResult.getPollResultItems() != null
                                && pollResult.getPollResultItems().getPollResultItemsList() != null) {
                            List<PollOrderTestItem> testResultItemsList = labResult.getPollResultItems()
                                    .getPollResultItemsList().stream().map(pollOrderItem -> toPollOrderItem(pollOrderItem,
                                            pollOrder.getPollOrderId(), pollResult.getPollResultHeader().getTestCode()))
                                    .collect(Collectors.toList());
                            return pollOrderTestItemRepository.saveAll(testResultItemsList).collectList()
                                    .flatMap(pollOrderItemResp -> {
                                        return Mono.just(pollOrder.getPollOrderId());
                                    });
                        } else {
                            return Mono.just(pollOrder.getPollOrderId());
                        }
                    });
        }

Here,

1. monoPubs.add((Mono<?>) saveOrphanPollOrderResult(ref, clientId, pollOder, pollResult).subscribe()); is troubling me.

Here, getting type cast error.

2. If I dont put.subscribe(), the statements inside the saveOrphanPollOrderResult is not getting invoked.

  1. Keeping without subscribe here, monoPubs.add(saveOrphanPollOrderResult(ref, clientId, pollOder, pollResult));

and adding subscribe() inside saveOrphanPollOrderResult like the one below causing compile time error as it cannot return any value and unable to add this inside the monos list.

private Mono<Long> saveOrphanPollOrderResult(final String ref, final String clientId, PollOrder pollOder,
                    PollResult pollResult) {
                return pollOrderTestRepository.save(toPollOrderTest(pollOrder, pollResult.getPollResultHeader()))
                        .flatMap(pollOrderTestRes -> {
                            if (pollResult.getPollResultItems() != null
                                    && pollResult.getPollResultItems().getPollResultItemsList() != null) {
                                List<PollOrderTestItem> testResultItemsList = labResult.getPollResultItems()
                                        .getPollResultItemsList().stream().map(pollOrderItem -> toPollOrderItem(pollOrderItem,
                                                pollOrder.getPollOrderId(), pollResult.getPollResultHeader().getTestCode()))
                                        .collect(Collectors.toList());
                                return pollOrderTestItemRepository.saveAll(testResultItemsList).collectList()
                                        .flatMap(pollOrderItemResp -> {
                                            return Mono.just(pollOrder.getPollOrderId());
                                        });
                            } else {
                                return Mono.just(pollOrder.getPollOrderId());
                            }
                        }).subscribe();   /// --> 
            }

your problem is here:

var id = pollOder.getPollOrderId();
var pollOrderOrphan = toPollOrderOrphan(id);

List<Mono<?>> monoPubs = new ArrayList<>();
monoPubs.add(pollOrderOrphanRepository.save(pollOrderOrphan));

labReport.getLabResults().getLabResultList().forEach(labResult -> {
    monoPubs.add((Mono<?>) saveOrphanPollOrderResult(ref, clientId, pollOder, pollResult).subscribe());
});

There are several issues, first of all using Mono<?> means that you want to store several different types in a List<T> this is bad practice of many different reasons you are probably aware of. Please use the type system.

Second of all is that you can't use a forEach loop. That is imperative programming, not reactive, that assumes that you have the items that you want to place in your list. Which you don't.

That's the reason to why you have to call subscribe , because you need to "wait in the concrete items" so you can place them in your list.

What you need to do is to start using Flux instead, which is a stream of presumed items.

i don't know your exact logic here since your code is quite messy, but as an example:

var labresultList = labReport.getLabResults().getLabResultList();
Mono<List<PollOrderResult> = Flux.fromIterable(labResultList)
    .flatMap(saveOrphanPollOrderResult(ref, clientId, pollOder, pollResult))
    .collectList();

And some OT:

I dont know what your item types are, but please try to avoid using <?> as that will most likely come back to bite you later.

And please use a bit more functions for readability, as the code is very hard to read, functions are free to use. Assigning variables instead of nesting calls also improves readability.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM