Ktor отвечает на поток вывода, вызывая io.netty.обработчик.тайм-аут.Исключение WriteTimeoutException

#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 вы можете увидеть пример.