是否可以使用声明性客户端通过以下方式下载较大的结果:使用InputStream
?我尝试了
HttpResponse<InputStream> getQueryResult(String jobId, String resultId);
但是它尝试下载整个正文,然后导致
io.micronaut.http.client.exceptions.ContentLengthExceededException: The received length exceeds the maximum content length
谢谢。
答案 0 :(得分:1)
这里发生的是,您的客户端请求一个完全接收(汇总)的HttpResponse,包装一个字节数组,然后将其转换为InputStream。为了获得不聚合的响应字节,您需要请求一种反应性类型,例如org.reactivestreams.Publisher
s的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!
}
(显然,阻塞对高吞吐量不利,但这只是一个例子)
我希望这会有所帮助。