#kotlin #outputstream #ktor #zipoutputstream
Вопрос:
У меня есть приложение Ktor, которое возвращает несколько файлов в виде потока, но, по-видимому, когда у клиента медленное подключение к Интернету, поток заполняется и запускает io.netty.обработчик.тайм-аут.Исключение времени записи.
kotlinx.coroutines.JobCancellationException: Parent job is Cancelling
Caused by: io.netty.handler.timeout.WriteTimeoutException: null
Есть ли способ предотвратить это ?
Вот мой метод:
suspend fun ApplicationCall.returnMultiFiles(files: List<StreamFile>) {
log.debug("Returning Multiple Files: ${files.size}")
val call = this // Just to make it more readable
val bufferSize = 16 * 1024
call.response.headers.append(
HttpHeaders.ContentDisposition,
ContentDisposition.Attachment.withParameter(ContentDisposition.Parameters.FileName, "${UUID.randomUUID()}.zip").toString())
call.respondOutputStream(ContentType.parse("application/octet-stream")) {
val returnOutputStream = this.buffered(bufferSize) // Just to make it more readable
ZipOutputStream(returnOutputStream).use { zipout ->
files.forEach{ record ->
try {
zipout.putNextEntry(ZipEntry(record.getZipEntry()))
log.debug("Adding: ${record.getZipEntry()}")
record.getInputStream().use { fileInput ->
fileInput.copyTo(zipout, bufferSize)
}
} catch (e: Exception) {
log.error("Failed to add ${record.getZipEntry()}", e)
}
}
}
}
}
Комментарии:
1. Не могли бы вы, пожалуйста, описать, как именно воспроизвести
WriteTimeoutException
это ?2. Все, что я сделал, это попытался загрузить большие файлы с медленной сетью.
3. Я не могу воспроизвести
WriteTimeoutException
, но вы могли бы попытаться полностью удалить время ожидания записи:embeddedServer(Netty, port = 8080, configure = { responseWriteTimeoutSeconds = -1 }) {}
. Здесь ktor.io/docs/engines.html#netty вы можете увидеть пример.