java - 下载大结果
问题描述
是否可以使用声明式客户端下载大型结果,例如使用InputStream
? 我尝试了一个客户签名,例如
HttpResponse<InputStream> getQueryResult(String jobId, String resultId);
但它试图下载整个身体,然后导致
io.micronaut.http.client.exceptions.ContentLengthExceededException: The received length exceeds the maximum content length
先感谢您。
解决方案
这里发生的是您的客户端请求一个完全接收(聚合)的 HttpResponse,包装一个字节数组,然后将其转换为 InputStream。为了在不聚合的情况下获取响应字节,您需要请求一种反应类型,例如 s 的一个org.reactivestreams.Publisher
(或其合适的子类)ByteBuffer
。然后你需要处理这些。
例子:
Flowable<ByteBuffer<?>> getQueryResult(String jobId, String resultId);
然后你可以在上面运行map
, forEach
, blockingForEach
, 等等io.reactivex.Flowable
- 但请记住释放缓冲区,否则你会产生很多垃圾,并得到讨厌的日志消息。示例(在 Groovy 中):
Flowable<ByteBuffer<?>> responseFlowable = myClient.getQueryResult("job1", "foo")
int sum = 0
responseFlowable.blockingForEach { ByteBuffer byteBuffer ->
sum += byteBuffer.toByteArray().count('!')
((ReferenceCounted)byteBuffer).release() // Let Netty do its thing!
}
(显然,阻塞不利于高吞吐量,但这只是一个例子)
我希望这有帮助。
推荐阅读
- excel - 覆盖和分配值
- ios - 捆绑包结构无效。不允许使用二进制文件“***”
- reactjs - 从内部组件库中使用 react-hook-form FormProvider 时不起作用
- java - 为什么在 Spring Data JDBC 中将实体-值关系实现为反向引用
- python-3.x - 在 Python 中的 except 子句中执行除打印语句之外的代码是一种好习惯吗?
- css - React CSS:当状态与 prevState 发生变化时,尝试将颜色赋予类几秒钟
- variables - 更改 .then 中的变量
- django - 在 django 中使用 firebase 进行身份验证时,如何绕过 drf 令牌身份验证?
- xamarin - 用于 Xamarin 表单的 Maps 插件(如果有)
- python - 错误:神经渲染器的构建轮子失败(google colab)