es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Boot: No funciona SSE (Servidor de Eventos Enviados)

En Spring Boot, cuando intentamos enviar un evento de servidor emitido, solo envía un evento de error que contiene los datos: {“timeout”:-1} cuando intentamos conectarnos, y la conexión se cierra. La clase Spring Boot es la siguiente:

@RestController
@CrossOrigin(origins = "*")
public class SsePushNotificationRestController {
    private static final Logger log = LoggerFactory.getLogger(SsePushNotificationRestController.class);
    private SseEmitter emitter;

    @GetMapping("/test")
    public String getString(){
        try {
            emitter.send("User connected");
            log.info("User connected");
            emitter.complete();
        } catch (Exception e) {
            log.info("Error while sending message to client: " + e.getMessage());
        }
        return "placeholder";
    }

    @GetMapping("/emitter")
    public SseEmitter eventEmitter(@RequestParam String userId) {
        emitter = new SseEmitter(-1L);
        return emitter;
    }
}

Y nuestro código de cliente es el siguiente:

const eventSource = new EventSource('http://localhost:8080/emitter?userId=testUser');

eventSource.addEventListener("message", (event) => {
    console.log(event);
});

eventSource.addEventListener("open", (event) => {
    console.log("connection opened");
});

eventSource.addEventListener("error", (e) => {
    if (e.readyState === EventSource.CLOSED) {
        console.log('closed');
    }
    else {
        console.log(e);
    }
    e.target.close();
});

document.getElementById("btn").onclick = e => {
    fetch('http://localhost:8080/test').then( data => console.log(data)).catch(data => console.log(data));
};

Inmediatamente, se crea un error antes de que podamos hacer clic en el botón para generar un evento.
error
¿Qué podría estar mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema está en el parámetro del constructor SseEmitter -1L. Este parámetro establece el tiempo de espera para la conexión ilimitado, lo cual hace que la conexión permanezca abierta indefinidamente. Sin embargo, algunos servidores web (como Tomcat) no permiten conexiones infinitas y, por lo tanto, envían un evento de error con los datos {"timeout":-1} y luego cierran la conexión. Para solucionar este problema, podemos establecer un valor de tiempo de espera no negativo en milisegundos, como new SseEmitter(60_000L) para un tiempo de espera de 60 segundos.

Comments are closed.