未在 Spring WebFlux Flux<DataBuffer> 中流式传输响应

not streaming response in Spring WebFlux Flux<DataBuffer>


    @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.<DataBuffer>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(Byte.decode("DD"));
                                    outputStream.flush();
                                    emitter.next(dataBuffer);
                                } catch (IOException  e) {
                                    e.printStackTrace();
                                }
                            });
                    emitter.complete();
                }
        );

        return next;
    }

emiiter.next(dataBuffer) 时,我无法从 webflux 服务器获得响应。

emitter.complete() 时,我得到了总回复。我想实时流媒体,我该怎么做?

您可能需要了解更多什么是 HTTP 流以及如何使用 Spring WebFlux 启用它:

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-async-http-streaming

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-codecs-streaming

Flux结果有特殊说明:

https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-ann-return-types

Emit server-sent events. The ServerSentEvent wrapper can be omitted when only data needs to be written (however, text/event-stream must be requested or declared in the mapping through the produces attribute).

查看我关于将 AMQP 数据流式传输到 HTTP 客户端的简单示例:https://github.com/artembilan/sandbox/tree/master/amqp-to-webflux