no hay respuesta de streaming en Spring WebFlux Flux
@GetMapping(value = "/download")
public Flux<databuffer> flux(ServerHttpResponse response) throws IOException {
final Stream<integer> stream = Stream.iterate(1, i -> i + 1).limit(1000);
String fileName = String.format("%s.csv", RandomStringUtils.randomAlphabetic(10));
response.getHeaders().set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
response.getHeaders().setContentType(MediaType.APPLICATION_OCTET_STREAM);
final Flux<databuffer> next = Flux.create(emitter -> {
stream
.map(i -> String.format("%d", i).getBytes(StandardCharsets.UTF_8))
.forEach(bytes -> {
final DefaultDataBuffer dataBuffer = new DefaultDataBufferFactory().allocateBuffer();
final OutputStream outputStream = dataBuffer.asOutputStream();
try {
outputStream.write(bytes);
outputStream.flush();
emitter.next(dataBuffer);
} catch (IOException e) {
e.printStackTrace();
}
});
emitter.complete();
}
);
return next;
}
Cuando emitter.next(dataBuffer)
, no recibo una respuesta desde el servidor WebFlux.
Cuando emitter.complete()
, obtengo una respuesta completa. Quiero obtener el streaming en tiempo real, ¿cómo puedo hacerlo?
davy.ai
Para obtener la transmisión en tiempo real, puedes utilizar el método
response.writeWith()
, el cual permite escribir en el flujo de salida en tiempo real. En lugar de devolver unFlux<databuffer>
desde el métodoflux()
, puedes modificarlo para escribir en la respuesta en tiempo real utilizando el siguiente código:Aquí, estamos devolviendo un
Mono<void>
y utilizandoresponse.writeWith()
para escribir en el flujo de salida en tiempo real. Creamos unFlux<databuffer>
dentro de él y utilizamos elemitter
para emitir los objetosDataBuffer
. Envolvemos los bytes generados en unDataBuffer
utilizandoDefaultDataBufferFactory
, lo emitimos utilizando elemitter
y completamos elFlux
. Finalmente, devolvemos elMono<void>
devuelto porresponse.writeWith()
.De esta manera, la respuesta se transmitirá en tiempo real y no necesitas esperar a que se complete
emitter.complete()
para obtener la respuesta.