Streamy dobre praktyki a wywoływanie zewnętrznych metod wewnątrz strumienia.

0

Cześć.
Czy wywoływanie zewnętrznych metod w strumieniu (metoda map), jak np. zapis do bazy prze repko springowe, może prowadzić do błędów/ nieoczekiwanych wyników w związku z wątkami ?
Mam pewną funkcjonalność, która polega na: Pobraniu listy obiektów z bazy, ale jeśli, któryś z obiektów ma jakieś puste pola, to najpierw musze zaktualizować dany rekord poprzez strzał do zewnętrznego Api. Procedura: a) pobierz Liste z bazy po danych id b) iteruj po każdym obiekcie, podczas iteracji jeśli ma puste pola to pobież z Api i zaktualizuj w bazie c) zwróć listę z uzupełnionymi o dane obiektami. Zrobiłem to za pomocą strumienia i map. Działać, działa, ale nie jestem przekonany do poprawności i czy nie nadawałby się forEach z consumerem tutaj, tylko z forEach chyba nie da się rozwiązać sprawy z jednym callem do bazy, ponieważ nie zwraca nic. Musiałbym jeszcze raz pobierac uzupełnioną listę.
Kod wygląda mniej więcej tak:

public List<Object> findObjects(long idOne, long idTwo, long idThree) {
        return objectRepository.findAllByidOneAndidTwo(idOne, idTwo).stream()
                .map(object -> {
                    if (hasEmptyValues(object)) {
                        return completeObjectData(idOne, idTwo, object);
                    }
                    return object;
                }).collect(Collectors.toList());
    }

    private Object completeObjectData(long idOne, long idTwo, Object object) {
        try {
            Object object = getObjectFromApi();
            return objectRepository.save(object);

        } catch (Exception e) {
            reportException();
            return object;  // jeśli zostaje rzucony wyjątek związany z api zewnętrznym to zwracany jest nieuzupełniony obiekt
        }
    }

1

O ile nie korzystasz z jakiegoś parallelStream to nie masz problemu.
I taki kod jest jak najbardziej poprawny(*) i jest odpowiednikiem tego forEach. NIe ma co filozować.
Wszystkoi dzieje się w ramach jednego wątku / w pętli - przewidywalnie.
Inne wątki się tam przez przypadek same nie pojawią żeby napsuć.

Dodatkowo: korzystasz z JPA i pewnie masz jakiegoś spring więc zasadniczo własne wątki i tak musisz sobie odpuścić.

(*) - Co do poprawności i dobrych praktyk kodu to oczywiście Object oriented programming i catch Exception wskazuje, że stało się tam coś złego, ale to inna historia.

0

Dlatego nie lubię java streamów, bo wymuszają chorą obsługę błędów. Nie taką, jaką by się zrobiło normalnym forem. Jeżeli jest problem z pobraniem obiektu z bazy danych, to program powinien się zwyczajnie wysypać.

0

Tak, zamysł był taki, że Exception z samego zewnętrznego Api miało łapać wyjątki, a przypadkowo łapie też z zapisu do bazy, po prostu operacje save poza try wywalę.

1
jarekczek napisał(a):

Dlatego nie lubię java streamów, bo wymuszają chorą obsługę błędów. Nie taką, jaką by się zrobiło normalnym forem. Jeżeli jest problem z pobraniem obiektu z bazy danych, to program powinien się zwyczajnie wysypać.

Jak wyjątek jest porządny (Runtime) to się wysypie.
Jak jest głupi to trzeba opakować - albo w Runtime, jak ma się sypać, albo w Try jeśli możemy obsłużyć.

To całkiem ok działa na strumieniach.

0

No własnie problem jest z checked exceptionami, to straszne rakowisko dla mnie. Dobrze że w keczupie ich nie ma

1 użytkowników online, w tym zalogowanych: 0, gości: 1