Разъедините вызов службы и хранение базы данных - PullRequest
0 голосов
/ 30 июня 2018

У меня есть следующее требование: запросить внешний сервер, чтобы сообщить результат контроллеру покоя и в то же время сохранить его в mongo. Дело в том, что при реализации ниже, когда есть ошибка Монго, результат не возвращается контроллеру покоя. Есть ли способ отделить оба вызова с помощью rxJAva?

public Observable<LowestFareByProvider> lowestFareByProvider(final 
 FlightSearchRequest flightSearchRequest) {
                final FlightSpecification flightSpecification = FlightSpecification.builder()
                        .from(flightSearchRequest.getFrom())
                        .to(flightSearchRequest.getTo())
                        .departure(flightSearchRequest.getDeparture())
                        .build();

                return flightService.lowestFareByProvider(flightSpecification, flightSearchRequest.getProviders())
                        .map(it -> {
                            logger.debug("Saving to db in thread: {}", Thread.currentThread().getName());
                            return lowestFareByProviderRepository.save(it);
                        })
                        .flatMap(Single::toObservable);
            }

1 Ответ

0 голосов
/ 01 июля 2018

Похоже, вы хотите поглотить ошибки, если не удалось сохранить вызов Mongo и перенаправить результат вашему подписчику.

public Observable<LowestFareByProvider> lowestFareByProvider(final 
 FlightSearchRequest flightSearchRequest) {
                final FlightSpecification flightSpecification = FlightSpecification.builder()
                        .from(flightSearchRequest.getFrom())
                        .to(flightSearchRequest.getTo())
                        .departure(flightSearchRequest.getDeparture())
                        .build();

                return flightService.lowestFareByProvider(flightSpecification, flightSearchRequest.getProviders())
                        .flatMap(result -> {
                            logger.debug("Saving to db in thread: {}", Thread.currentThread().getName());
                            return Observable.fromCallable(() -> { lowestFareByProviderRepository.save(result)})
                                             .onErrorReturn(result);
                        });

Пожалуйста, проверьте синтаксис. Здесь onErrorReturn игнорирует ошибки из вызова сохранения Mongo (если есть) и перенаправляет результат обратно подписчику. И я удалил Single::toObservable, так как у вас есть Observable на этом этапе.

...