Переслать поток загрузки файлов на S3 через Iteratee с Play2 / Scala
Мы читали некоторые материалы о возможности отправки файла в S3 через Iteratee, что, похоже, позволяет отправлять таким образом фрагменты файла S3 по мере их получения и избегать использования OutOfMemory для больших файлов, например.
мы нашли этот ТАК пост, который, вероятно, почти то, что мне нужно сделать:Play 2.x: загрузка файлов с помощью Iteratees Я нене понимаю, как это сделать, или если этодействительно доступны в Play 2.0.2 (потому что Садек Броди говорит, что foldM доступен в Play 2.1 только для примера)
Может ли кто-то объяснить это простым способом, для кого-то, кто читал какой-то блог об Итератах, и еще не является экспертом по Scala / Play2?
Я недаже не знаю, стоит ли мне использовать многочастный анализатор тела или что-то в этом роде, но я знаю одно, что я нене понимаю, что делает этот код:
val consumeAMB =
Traversable.takeUpTo[Array[Byte]](1028*1028) &>> Iteratee.consume()
val rechunkAdapter:Enumeratee[Array[Byte],Array[Byte]] =
Enumeratee.grouped(consumeAMB)
val writeToStore: Iteratee[Array[Byte],_] =
Iteratee.foldM[Array[Byte],_](connectionHandle){ (c,bytes) =>
// write bytes and return next handle, probable in a Future
}
BodyParser( rh => (rechunkAdapter &>> writeToStore).map(Right(_)))
Кстати, какая будет разница в потреблении памяти по сравнению с использованием классического Java InputStream / OutputStream. На самом деле я могу пересылать 500-мегабайтный файл на S3 неблокирующим способом, с очень низким потреблением памяти, без использования Iteratees, с использованием Java + AsyncHttpClient + Grizzly (но я думаю, это также будет работать с Netty).
И что'Преимущество использования Iteratee?
Одно отличие, которое я вижу, состоит в том, что InputStream, который я получаю и пересылаю в S3, в моем случае поддерживается временным файлом (это поведение CXF), поэтому он может быть не таким реактивным, как Play Iteratee.
Но в случае с итераторами, если перечислитель создает байты, полученные соединением, и пересылает их на S3 через итератора, тогда, если соединение с S3 не является хорошим и байты могут 'Быстро пересылать, где хранятся "в ожидании» байт?