确保Jersey';s StreamingOutput关闭了吗?
我正在开发一个RESTAPI,我正在为此使用Jersey。其中一个端点正在返回文件,我正在为此使用确保Jersey';s StreamingOutput关闭了吗?,jersey,response,inputstream,resource-cleanup,Jersey,Response,Inputstream,Resource Cleanup,我正在开发一个RESTAPI,我正在为此使用Jersey。其中一个端点正在返回文件,我正在为此使用StreamingOut final InputStream is = getInputStreamFor(fileHandle); StreamingOutput so = new StreamingOutput() { @Override public void write(OutputStream os) throws IOException, WebApplic
StreamingOut
final InputStream is = getInputStreamFor(fileHandle);
StreamingOutput so = new StreamingOutput() {
@Override
public void write(OutputStream os) throws IOException, WebApplicationException {
try {
IOUtils.copy(is, os);
os.flush();
} catch (Exception e) {
throw e;
} finally {
is.close();
}
}
}
return Response
.ok(rs)
.build();
据我所知;这里发生的事情是,我从我的方法返回响应
,然后Jersey通过调用write(OutputStream os)
方法开始将InputStream
写入OutputStream
。也就是说,在我的方法之后调用write(OutputStream os)
现在,如果Jersey在调用write(OutputStream os)
之前出现问题怎么办?InputStream
将永远不会关闭
我是否应该跟踪我交给响应的所有InputStream
实例,并在(比如)5分钟后尝试关闭它们,以确保一切都得到了很好的清理
我不喜欢分发InputStream
实例的想法,顺便说一句,泽西不知道如何关闭这些实例,也无法确保自己将所有事情都清理干净