Wpis z mikrobloga

Jak to zrobić w WebFlux żeby po operacji dodania itemu do bazy, automatycznie wysyłać taką informację do endpointu który zbiera wszystkie itemy z bazy? Chodzi o to że mam powiedzmy tabele songs, odpytuję endpoint /GET songs i zwraca mi TEXTEVENTVALUESTREAM i wszystkie elementy, teraz kiedy dodałbym item poprzez /POST songs chciałbym żeby w tamtej karcie przeglądarki pojawił się nowy item. Wiem, że to jest możliwe ale nie wiem jak się podpiąc pod insniejący stream? Może żeby reagował na jakiś event?

Mój kod:

@RestController
@RequestMapping("/songs")
public class SongController {

private final SongRepository songRepository;

public SongController(SongRepository songRepository) {
this.songRepository = songRepository;
}

@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux getAllSongs() {
return Flux.interval(Duration.ofSeconds(1))
.flatMap(x -> songRepository.findAll());
}

@PostMapping
public Mono addSong(@RequestBody Song song) {
return songRepository.save(song);
}
}

Narazie odpytuje co sekundę ale wtedy mi zwraca za każdym razem całość (razem z nowym itemem) a nie dokłada nowy.

#webflux #flux #spring #programowaniereaktywne #java
  • 5
@MrFisherman: kumam chyba co chcesz zrobić - chcesz żeby Ci zwracało deltę a nie cały stream. Więc to co ty musiałbyś zrobić to na froncie trzymac se w cache całość danych a endponintem ciągnąć deltę (zmianę). Więc (koncepcyjnie) ja bym to widział tak:
1. Dodaj sobie endpoint getDeltaSongs - endpoint z logiką która zwraca te songi które zostały ostatnio dodane (czyli tą deltę) - różnicę względem całości
2. Zrobić cachowanie po