Jersey 2客户端,它将数据流写入POST调用chunk的块

时间:2016-08-12 13:51:31

标签: java jax-rs jax-ws jersey-2.0 jersey-client

我想编写一个Jersey 2 Client,它会将数据流写入块中的POST调用块。

为什么呢? ,这将帮助我避免在通过POST调用发送之前保持整个输入流请求数据存储在磁盘存储器中。

我已经通过网络搜索并查看了Jersey2 API,但没有找到任何解决方案,但是有服务器端的解决方案在流中发送大量响应并在Jersey客户端中通过执行GET调用来读取相同内容客户端,但我希望发送巨大的有效负载,例如1 GB的XML数据作为流对POST呼叫。

我尝试使用here中给出的解决方案,但此解决方案再次使用系统内存。

我不想在磁盘中存储1GB的数据,而是在运行中创建1GB的数据请求流/将1GB数据直接写入POST调用POST块。

任何帮助高度赞赏。 在此先感谢。

1 个答案:

答案 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。