Server Sent Events

SSE (Server Sent Events) provides one-way server-to-client communications, it is based on the existing HTTP protocol. In the real world applications, it is useful for sending notifications to clients or some like real time events update in a stream approach, such as news update or stock update, etc.

Server Side

In the server side, expose a SSE endpoint is easy. Set the content type to text/event-stream, and produces a Flux stream in the response body.

@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Post> sse() {
    return Flux
        .zip(Flux.interval(Duration.ofSeconds(1)), this.posts.findAll().repeat())
        .map(Tuple2::getT2);
}

The above example is emitting a time based event.

Source codes: spring-reactive-sample/sse.

Client Side

There is no special client to consume SSE APIs, like interacting with RESTful APIs, use the existing WebClient to consume a SSE endpoint, do not forget to set Accept header to text/event-stream to consume SSE events.

client.get()
    .uri("messages")
    .accept(MediaType.TEXT_EVENT_STREAM)
    .retrieve()
    .bodyToFlux(Message::class.java)

A more close to the real world example, go to hantsy/angular-spring-sse-sample/ in which the client is built with Angular and the server side is a simple Spring Boot application that uses SSE to update the chat messages to client.