Implementare i Server-Sent Events (SSE) con Java Spring Boot

I Server-Sent Events (SSE) sono un meccanismo che consente ai server di inviare aggiornamenti automatici ai client attraverso una connessione HTTP unidirezionale. Questa tecnologia è particolarmente utile per applicazioni in tempo reale come notifiche, aggiornamenti di stato, feed di dati e altro. In questo articolo, vedremo come implementare SSE in un'applicazione Spring Boot.

Inizia creando un nuovo progetto Spring Boot utilizzando Spring Initializr. Aggiungi le seguenti dipendenze:

  • Spring Web
  • Spring Boot DevTools (opzionale, ma utile per il reload automatico durante lo sviluppo)

Crea un nuovo controller che gestirà la logica per inviare gli eventi SSE. In questo esempio, creeremo un controller chiamato SseController.


package com.example.sse;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;

import java.time.Duration;
import java.time.LocalTime;

@RestController
public class SseController {

    private final Sinks.Many<String> sink;

    public SseController() {
        this.sink = Sinks.many().multicast().onBackpressureBuffer();
    }

    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamEvents() {
        return sink.asFlux().map(e -> "data: " + e + "\n\n");
    }

    @GetMapping("/send")
    public String sendEvent() {
        String event = "Current time: " + LocalTime.now();
        sink.tryEmitNext(event);
        return "Event sent: " + event;
    }
}

Dettagli del codice:

  1. Sinks: Utilizziamo Sinks di Project Reactor per gestire il flusso di eventi. Sinks.many().multicast().onBackpressureBuffer() crea un sink multicasting che consente di emettere eventi a più subscriber.

  2. streamEvents(): Questo endpoint restituisce un Flux<String> che rappresenta un flusso di eventi SSE. L'annotazione @GetMapping specifica che questo endpoint produce MediaType.TEXT_EVENT_STREAM_VALUE, che è il tipo di contenuto per SSE.

  3. sendEvent(): Questo endpoint simula l'invio di un evento SSE. Aggiunge un evento con l'ora corrente al sink, che viene poi trasmesso a tutti i subscriber.

Conclusione

In questo articolo, abbiamo visto come implementare i Server-Sent Events in un'applicazione Spring Boot. Utilizzando Flux di Project Reactor e gli endpoint di Spring Web, abbiamo creato un semplice sistema per inviare aggiornamenti in tempo reale ai client. Questa implementazione può essere estesa e adattata per soddisfare le esigenze specifiche della tua applicazione, come l'invio di notifiche, aggiornamenti di stato o qualsiasi altro tipo di dato in tempo reale.

Torna su