SSE je vcelku jednoduche a zaroven ine... Nie je to celkom klasicke imperativne programovanie, nakolko je to posielanie eventov pripojenemu klientovi. Odporucam mrknut tutorial tuna:
https://www.baeldung.com/spring-server-sent-eventsPrvy pristup (webflux) je vhodny, ak mate prehlad o on-blocking. Predpokladam skor, ze nie a tak odporucam druhy pristup (Sring MVC). Tam si nasledne spravite nieco ako toto:
private BindingMedziTechnologiami bindingSluzba;
@GetMapping("/stream-sse-mvc")
public SseEmitter streamSseMvc() {
SseEmitter emitter = new SseEmitter();
bindingSluzba.pridajKlientíkaPištíka(nejakéIdZískaťZAutentifikácieNapriklad, emitter);
return emitter;
}
@Service
class BindingMedziTechnologiami {
private Map<IdKlienta, SseEmitter> binding = new HashMap();
public void pridajKlientíkaPištíka(IdKlienta id, SseEmitter konektivitaSSENaKlienta) {
binding.put(id, konektivitaSSENaKlienta);
}
public void posliKlientoviNaprikladAMQPSpravu(IdKlienta id, Správička správa) {
final SseEmitter emitter = binding.get(id);
SseEventBuilder event = SseEmitter.event()
.data(String.valueOf(správa))
.id("42")
.name("sse event - mvc");
emitter.send(event);
}
}
Strucne vysvetlenie: Ked klient pristupi na url /stream-sse-mvc, tak sa zavola metodka, ktora ulozi SseEmitter (objekt umoznujuci posielat klientovi spravy) v sluzbe BindingMedziTechnologiami do mapy. Nasledne, ked z amqp handleru chcete nieco poslat, pouzijete tu istu sluzbu, ktora z mapy vyberie emitter a posle spravu.
Co chyba, je hendling chýb, vymazavanie klientov z mapy po odhlaseni a podobne "drobnosti".
Hadam nastrel pomoze.