我想编写一个Jersey 2 Client,它会将数据流写入块中的POST调用块。
为什么呢? ,这将帮助我避免在通过POST调用发送之前保持整个输入流请求数据存储在磁盘存储器中。
我已经通过网络搜索并查看了Jersey2 API,但没有找到任何解决方案,但是有服务器端的解决方案在流中发送大量响应并在Jersey客户端中通过执行GET调用来读取相同内容客户端,但我希望发送巨大的有效负载,例如1 GB的XML数据作为流对POST呼叫。
我尝试使用here中给出的解决方案,但此解决方案再次使用系统内存。
我不想在磁盘中存储1GB的数据,而是在运行中创建1GB的数据请求流/将1GB数据直接写入POST调用POST块。
任何帮助高度赞赏。 在此先感谢。
答案 0 :(得分:1)
经过大量的研究后,我找到了解决方案,并且在这里:
首先我们需要实现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。