Можно ли установить обратный вызов после завершения обработки запроса в Spray?
Я пытаюсь обслуживать большие временные файлы из Spray. Мне нужно удалить эти файлы после завершения HTTP-запроса. Я не мог найти способ сделать это до сих пор ...
Я использую код, похожий наэтот или это:
respondWithMediaType(`text/csv`) {
path("somepath" / CsvObjectIdSegment) {
id =>
CsvExporter.export(id) { // loan pattern to provide temp file for this request
file =>
encodeResponse(Gzip) {
getFromFile(file)
}
}
}
}
Так по сути это вызываетgetFromFile
который завершает маршрут вFuture
, Проблема в том, что даже если этоFuture
веб-запрос еще не завершен. Я пытался написать функцию, похожую наgetFromFile
и я бы позвонилfile.delete()
вonComplete
того, чтоFuture
но у него та же проблема -Future
завершается до того, как клиент завершил загрузку файла, если файл достаточно велик.
ВотgetFromFile
от спрей для справки:
/**
* Completes GET requests with the content of the given file. The actual I/O operation is
* running detached in a `Future`, so it doesn't block the current thread (but potentially
* some other thread !). If the file cannot be found or read the request is rejected.
*/
def getFromFile(file: File)(implicit settings: RoutingSettings,
resolver: ContentTypeResolver,
refFactory: ActorRefFactory): Route =
getFromFile(file, resolver(file.getName))
Я не могу использоватьfile.deleteOnExit()
потому что JVM не может быть перезапущен на некоторое время, а временные файлы будут продолжать лежать вокруг траты дискового пространства.
С другой стороны, это более общий вопрос - есть ли способ установить обратный вызов в Spray, чтобы после завершения обработки запросов можно было освободить ресурсы или обновить статистику / журналы и т. Д.