我想编写一个Jersey 2客户端,它将数据流逐块写入POST调用。
为什么? ,这将帮助我避免在通过POST调用发送之前将整个输入流请求数据存储在磁盘内存中。
我已经在网上搜索并查看了Jersey2 API,但没有找到任何解决方案,但是有服务器端解决方案,该解决方案在流中发送巨大的响应,并通过在Client上执行GET调用在Jersey Client中读取相同的响应,但是我想发送巨大的有效负载,说有1 GB的XML数据作为POST调用的流。
我尝试使用here中给出的解决方案,但是该解决方案再次使用了系统内存。
我不想在磁盘上存储1GB的数据,而是即时创建1GB的请求数据流/将1GB的数据直接逐块写入POST调用。
任何帮助,高度赞赏。
提前致谢。
最佳答案
经过大量研究后,我找到了解决方案,然后就可以了:
首先,我们需要实现如下所述的javax.ws.rs.core.StreamingOutput
:
public class JerseyStreamingOutput implements StreamingOutput {
/**
* Overriding the write method to write request data directly to Jersey outputStream .
* @param outputStream
* @throws IOException
* @throws WebApplicationException
*/
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
// Write to Jersey OutputStream chunk by chunk here
}
}
泽西中心代码:
JerseyStreamingOutput jerseyStreamingOutput =
new JerseyStreamingOutput();
WebTarget target = client.target("http:localhost:8080");
response = target.path("/somepath").
request().post(Entity.entity(jerseyStreamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE));
因此,上述解决方案通过将请求块逐块写入outputStream来帮助节省硬盘内存,如果没有这种方法,我们最终会将请求xml文件说成1GB放在硬盘中。