下载大结果

时间:2018-09-22 13:39:45

标签: java micronaut

是否可以使用声明性客户端通过以下方式下载较大的结果:使用InputStream?我尝试了

这样的客户端签名
HttpResponse<InputStream> getQueryResult(String jobId, String resultId);

但是它尝试下载整个正文,然后导致

io.micronaut.http.client.exceptions.ContentLengthExceededException: The received length exceeds the maximum content length 

谢谢。

1 个答案:

答案 0 :(得分:1)

这里发生的是,您的客户端请求一个完全接收(汇总)的HttpResponse,包装一个字节数组,然后将其转换为InputStream。为了获得不聚合的响应字节,您需要请求一种反应性类型,例如org.reactivestreams.Publisher s的ByteBuffer(或其适当的子类)。然后您需要处理这些。

示例:

Flowable<ByteBuffer<?>> getQueryResult(String jobId, String resultId);

然后您可以在该map上运行forEachblockingForEachio.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!
}

(显然,阻塞对高吞吐量不利,但这只是一个例子)

我希望这会有所帮助。