1
votes

I have a question regarding Spring Webflux. I wanted to create a reactive endpoint that consumes content type text/event-stream. Not produce but consume. One of our services needs to send a lot of small objects to another one and we thought that streaming it this way might be a good solution.

@PostMapping(value = "/consumeStream", consumes = MediaType.TEXT_EVENT_STREAM_VALUE)
public Mono<Void> serve(@RequestBody Flux<String> data) {
    return data.doOnNext(s -> System.out.println("MessageReceived")).then();
}

I am trying to use Spring WebClient to establish a connection to the endpoint and stream data to it. For example using code:

WebClient.builder().baseUrl("http://localhost:8080")
            .clientConnector(new ReactorClientHttpConnector())
            .build()
            .post()
            .uri("/test/serve")
            .contentType(MediaType.TEXT_EVENT_STREAM)
            .body(BodyInserters.fromPublisher(flux, String.class))
            .exchange()
            .block();

The flux is a stream that produces a single value every 1 sec. The problem I have is that the WebClient fully reads the publisher and then sends the data as a whole and not streams it one by one. Is there anything I can do to do this using this client or any other ? I do not want to go the websockets way.

1

1 Answers

1
votes

SSE standard does not allow POST. There is no way to specify method even in browser API https://www.w3.org/TR/eventsource/

Server Side Events as name states are designed for delivering events from the server to the client.