Java 使用JAX-RS通过HTTP PUT传输字节

Java 使用JAX-RS通过HTTP PUT传输字节,java,http,webserver,streaming,jax-rs,Java,Http,Webserver,Streaming,Jax Rs,我有一个工作流,涉及从Java客户机到web服务器的HTTP POST。post的主体有一个specification对象。然后,我将它从我的Web服务器传递给ApacheZooKeeper(它在服务器上运行自己的进程),后者运行一个复杂的计算。我正在努力弄清楚如何以流式方式将字节发送回我的Web服务器。我需要它流回,因为我的Java客户机在我的Web服务器上有一个HTTP GET请求,它正在等待流回字节。我不能等待整个计算完成,我希望尽快将字节发送回客户端 大多数在线JAX-RS示例都从客户端

我有一个工作流,涉及从Java客户机到web服务器的HTTP POST。post的主体有一个specification对象。然后,我将它从我的Web服务器传递给ApacheZooKeeper(它在服务器上运行自己的进程),后者运行一个复杂的计算。我正在努力弄清楚如何以流式方式将字节发送回我的Web服务器。我需要它流回,因为我的Java客户机在我的Web服务器上有一个HTTP GET请求,它正在等待流回字节。我不能等待整个计算完成,我希望尽快将字节发送回客户端

大多数在线JAX-RS示例都从客户端和Web服务器端执行HTTP PUT,但没有流式代码示例。我会发布到目前为止我所拥有的,但它不起作用

下面是我的ZooKeeper Java代码,它调用JAX-RS客户端PUT。我真的不确定如何做到这一点,我从来没有尝试过使用JAX-RS流式传输数据

final Client client = ClientBuilder.newClient();
final WebTarget createImageTarget = client.target("groups/{imageGroupUuid:" + Regex.UUID + "}");
StreamingOutput imageResponse = createImageTarget.request(MediaType.APPLICATION_OCTET_STREAM).put(Entity.entity(createRandomImageDataBytes(imageConfigurationObject), MediaType.APPLICATION_OCTET_STREAM), StreamingOutput.class);
下面是我处理HTTP PUT的Web服务器代码。它只是一个存根,因为我对客户端HTTP PUT没有信心

@PUT
@PATH("groups/{uuid:" + Regex.UUID + "}")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public void updateData(StreamingOutput streamingOutput)
{

}

试着这样做:

@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{arg}")
public Response get(@PathParam("arg") {

    //get your data based on "arg"

    StreamingOutput stream = new StreamingOutput() {
        @Override
        public void write(OutputStream os) throws IOException, WebApplicationException {
            Writer writer = new BufferedWriter(new OutputStreamWriter(os));

            for (org.neo4j.graphdb.Path path : paths) {
                writer.write(path.toString() + "\n");
            }
            writer.flush();
        }
    };

    return Response.ok(stream).build();
}

@PUT
@Consumes("application/octet-stream")
public Response putFile(@Context HttpServletRequest request,
                     @PathParam("fileId") long fileId,
                     InputStream fileInputStream) throws Throwable {
    // Do something with the fileInputStream
    // etc
}
你可能会发现相关的。