如何关闭 REST 服务的流?
How to close a Stream of a REST Service?
我需要制作一个 java REST 服务,该服务将 return 输入流作为响应。我的问题是我不知道如何在客户端收到整个流后关闭流。我正在使用 Java 和 CXF。谢谢
@GET
@Path("/{uuid}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getAttachmentByUuid(@PathParam("uuid")String uuid)
{
//getting inputstream from AWS S3
InpputSream is=getStreamFromS3(uuid);
return Response.status(Response.Status.OK).entity(is).build();
// will this "is" stream causes memory leak,, do I have to close it. Client side is not controlled by me
}
您可能希望使用 'Conduit'
有关详细信息,请参阅 CXF Apache Custom Transport。
不过要小心,文档指出:
It is strongly recommended to don’t break streaming in Conduit and Destination implementations, if physical protocol supports it. CXF is completely streaming oriented – it causes high performance and scalability.
JAX-RS 是使用 Java servlet 实现的。如果使用 CXF CXFServlet
。您的流将使用 servlet 接口
的 HttpServletResponse
发送到客户端
public void doGet(HttpServletRequest request, HttpServletResponse response)
如果您尚未创建流源,则不应关闭它 (HttpServletResponse
)。这是容器的责任,你可以干扰请求的生命周期
另见
如果您有要关闭的流,请考虑尝试使用资源:
@GET
@Path("/{uuid}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getAttachmentByUuid(@PathParam("uuid")String uuid)
{
//getting inputstream from AWS S3
// the try block opens the stream and guarantees to close it
try (InputStream is=getStreamFromS3(uuid)) {
return Response.status(Response.Status.OK).entity(from(is)).build();
}
}
这需要 Java 7 及以上。也很棒!
如果您在 Java 6,那么您将不得不创建自己的 finally 块以记住为您关闭流。
我需要制作一个 java REST 服务,该服务将 return 输入流作为响应。我的问题是我不知道如何在客户端收到整个流后关闭流。我正在使用 Java 和 CXF。谢谢
@GET
@Path("/{uuid}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getAttachmentByUuid(@PathParam("uuid")String uuid)
{
//getting inputstream from AWS S3
InpputSream is=getStreamFromS3(uuid);
return Response.status(Response.Status.OK).entity(is).build();
// will this "is" stream causes memory leak,, do I have to close it. Client side is not controlled by me
}
您可能希望使用 'Conduit' 有关详细信息,请参阅 CXF Apache Custom Transport。 不过要小心,文档指出:
It is strongly recommended to don’t break streaming in Conduit and Destination implementations, if physical protocol supports it. CXF is completely streaming oriented – it causes high performance and scalability.
JAX-RS 是使用 Java servlet 实现的。如果使用 CXF CXFServlet
。您的流将使用 servlet 接口
HttpServletResponse
发送到客户端
public void doGet(HttpServletRequest request, HttpServletResponse response)
如果您尚未创建流源,则不应关闭它 (HttpServletResponse
)。这是容器的责任,你可以干扰请求的生命周期
另见
如果您有要关闭的流,请考虑尝试使用资源:
@GET
@Path("/{uuid}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getAttachmentByUuid(@PathParam("uuid")String uuid)
{
//getting inputstream from AWS S3
// the try block opens the stream and guarantees to close it
try (InputStream is=getStreamFromS3(uuid)) {
return Response.status(Response.Status.OK).entity(from(is)).build();
}
}
这需要 Java 7 及以上。也很棒!
如果您在 Java 6,那么您将不得不创建自己的 finally 块以记住为您关闭流。