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
}
}