Что является хорошим способом обеспечить закрытие основных потоков для StreamingOutput из Джерси?
Я работаю над REST API и использую для этого Джерси. Одна из конечных точек возвращает файлы, и я использую 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();
Насколько я понял; что происходит здесь, я возвращаю Response
от моего метода, и оттуда Джерси начинает писать InputStream
к OutputStream
вызывая write(OutputStream os)
метод. Это write(OutputStream os)
вызывается после моего метода.
Теперь, что, если что-то пойдет не так, прежде чем Джерси дойдет до точки вызова write(OutputStream os)
? InputStream
никогда не будет закрыт.
Должен ли я отслеживать все InputStream
случаи, которые я передаю Response
и попытаться закрыть их, скажем, через 5 минут, чтобы быть уверенным, что все хорошо вычищено?
Мне не нравится мысль раздавать InputStream
случаи, когда Джерси, кстати, не может знать, как закрыться, и не может быть уверен, что все вычищено.