我想编写一个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放在硬盘中。

10-07 13:07
查看更多