RxJava i spring-data

RxJava i spring-data
DJ
  • Rejestracja:około 13 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Trójmiasto
  • Postów:18
0

Hej,

pytanie korzystając z ReactiveMongoRepository i RxJavy odpytuje kilka api cyklicznie o dane. Następnie korzystają z zip tworze nowy obiekt który chce zapisać w bazie, mapuje wywołując weatherRepository.save(weather) i rekord nie zapisuje się. Pytanie co robię źle?

Kopiuj
        var cities = citiesRepository.findAll();
        Observable<Weather> callOpenWeather = Observable.interval(10, TimeUnit.SECONDS)
                .observeOn(Schedulers.computation())
                .flatMap(n -> Observable.fromPublisher(cities))
                .flatMap(openWeatherApiHandler::compute);
        Observable<Weather> callDarkSky = Observable.interval(10, TimeUnit.SECONDS)
                .observeOn(Schedulers.computation())
                .flatMap(n -> Observable.fromPublisher(cities))
                .flatMap(darkSkyApiHandler::compute);
        Observable<Weather> callWeatherBit = Observable.interval(10, TimeUnit.SECONDS)
                .observeOn(Schedulers.computation())
                .flatMap(n -> Observable.fromPublisher(cities))
                .flatMap(callWeatherBitApiHandler::compute);
        Observable.zip(callOpenWeather, callDarkSky, callWeatherBit, 
                (weather1, weather2, weather3) -> new Weather(Arrays.asList(weather1, weather2, weather3)))
                .map(weather -> weatherRepository.save(weather))
                .subscribe();

przykładowa funkcja compute

Kopiuj
    public ObservableSource<Weather> compute(City city) {
        var response = WebClient.builder().baseUrl(darkSkyBaseUrl).build().get()
                .uri("/" + darkSkyApiKey + "/" + city.getLatitude() + "," + city.getLongitude())
                .exchange()
                .doOnError(Throwable::printStackTrace)
                .flatMap(clientResponse -> clientResponse.bodyToMono(JsonNode.class))
                .map(jsonNode -> new Weather(jsonNode, city.getName(), Weather.WeatherSupplier.DARK_SKY));
        return Observable.fromPublisher(response);
    }

gdy w funkcji compute dodam mapowanie z zapisem do bazy, rekord zapisuje się poprawnie

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Na szybko. Tam gdzie masz save to powinno być zrobione we flatMap, a nie w map. Zobacz co zwraca save.


jeden i pół terabajta powinno wystarczyć każdemu
Zobacz pozostałe 3 komentarze
jarekr000000
Z ciekawostek: takie błędy wykrywa się w 90% w czasie kompilacji, jeśli tylko nie będziesz pisał metod void/Unit i statementów. Tylko wyrażenia. W kotlinie działa to nieźle, szczegolnie z rx-ami.
Michał Sikora
Michał Sikora
Powiedziałbym, że akurat Rx może być źródłem czeskich błędów w Kotlinie. Zdarzyło mi się już napisać coś w tym stylu parę razy - https://android.jlelse.eu/kotlin-and-rx2-how-i-wasted-5-hours-because-of-wrong-brackets-581021717774. Można się czasem nadziać niestety, bo nie ma w Javie czegoś, co by było przeciwieństwem @FunctionalInterface i chowałoby konwersję SAM dla Kotlina.
jarekr000000
@Michał Sikora: A zobacz, że tam też problem nie wychodzi w kompilacji, bo głupie CompletableSource ma metodę void :-) Widzisz, jak się ma teorię, to wszystko da się dopasowąć :-). Btw. problem klamry kojarze, ale najwięcej nad nim siedziałem, jak tu kiedyś @scibi92 jakiś kotlin kod wrzucił. Tak normalnie, jakoś mnie nie trafia często, wręcz polubiłem ten ich koncept lambdo / klamr.
S9
@jarekr000000: A no pamiętam :D
Michał Sikora
Michał Sikora
@jarekr000000: Nie no, ja się zgadzam, że void to jeden z grzechów głównych i unikając go, można zrzucić na kompilator bardzo dużo. Unit jest o tyle lepszy, że faktycznie czymś jest. Trochę jak Void, ale użyteczny ze względu na składnię :). I konwencja lambdo / klamr też mi się bardzo podoba i stosuję, kiedy mogę, ale właśnie w RxJavie się parę razy złapałem z tymi domniemanymi SAMami. Po prostu trzeba się bardziej pilnować przy operatorach Rx'a w Kotlinie. Na Slacku przynajmniej raz na tydzień się ktoś pyta, czemu coś nie działa z tego powodu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.