RxNetty下载大文件

时间:2016-02-22 17:51:47

标签: spring rx-netty

我尝试使用RxNetty

创建下载大文件的控制器

我写了一些愚蠢的东西,如

@RequestMapping(method = RequestMethod.GET, path = "largeFile")
public DeferredResult<ResponseEntity<byte[]>> largeFile() throws IOException {
    Observable<ResponseEntity<byte[]>> observable = RxNetty.createHttpGet(URL)
                                            .flatMap(AbstractHttpContentHolder::getContent)
                                            .map(data -> {
                                                byte[] bytes = new byte[data.readableBytes()];
                                                data.readBytes(bytes);
                                                return new ResponseEntity<>(bytes, HttpStatus.OK);
                                            });
    DeferredResult<ResponseEntity<byte[]>> deferredResult = new DeferredResult<>();
    observable.subscribe(deferredResult::setResult, deferredResult::setErrorResult);
    return deferredResult;
}

然而,我有以下错误:

Caused by: io.netty.handler.codec.TooLongFrameException: HTTP content length exceeded 1048576 bytes.

1 个答案:

答案 0 :(得分:1)

RxNetty 0.4.x中的默认客户端聚合HTTP有效负载,该有效负载对最大内容长度有限制。您看到的例外是因为该限制。您可以使用PipelineConfigurator更改默认客户端,如下例所示:

https://github.com/ReactiveX/RxNetty/blob/0.4.x/rxnetty-examples/src/main/java/io/reactivex/netty/examples/http/chunk/HttpChunkClient.java#L49

之后,有效载荷将被分成多个缓冲区。

或者,如果您知道最大大小,则可以在配置程序中使用适当的有效负载聚合器。