Я столкнулся с очень конкретным случаем, когда блок finally не выполняется, связанный конкретно с игровой средой.
Я был удивлен, обнаружив, что блок finally в этом коде действия контроллера вызывается только после исключения, но никогда, когда вызов действительно завершился успешно.
try {
InputStream is = getInputStreamMethod();
renderBinary(is, "out.zip");
catch (Exception e) {
e.printStackTrace();
} finally {
cleanUp();
}
Возможно, поток прерывается или что-то при вызове renderBinary (). Я подозреваю, что то же самое происходит с другими вызовами render (), но я не проверял это.
Я решил проблему, переместив renderBinary () после try / catch. Дальнейшие исследования показали, что play предоставляет аннотацию @Finally для создания метода, который выполняется после выполнения действия контроллера. Предостережение заключается в том, что это будет вызвано после выполнения ЛЮБОГО действия в контроллере, поэтому это не всегда может быть хорошим выбором.