Переслать поток загрузки файлов на 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 не является хорошим, и байты не могут быть перенаправлены очень быстро, где хранятся «ожидающие» сообщения. байт?

Ответы на вопрос(1)

Ваш ответ на вопрос