Reenvíe un flujo de carga de archivos a S3 a través de Iteratee con Play2 / Scala

He leído algunas cosas sobre la posibilidad de enviar un archivo a S3 a través de Iteratee, que parece permitir enviar fragmentos de S3 de un archivo a medida que los recibimos y evitar un OutOfMemory para archivos grandes, por ejemplo.

He encontrado esta publicación SO que es probablemente casi lo que necesito hacer:Play 2.x: Carga reactiva de archivos con Iteratees Realmente no entiendo cómo hacerlo, o si está realmente disponible en Play 2.0.2 (porque Sadek Brodi dice que foldM está disponible en Play 2.1 solo por ejemplo)

¿Alguien puede explicar esto de manera simple, para alguien que ha leído un blog sobre Iteratees y todavía no es un experto en Scala / Play2?

Ni siquiera sé si debería usar un analizador de cuerpo de varias partes o algo así, pero una cosa que sé es que no entiendo lo que hace este código:

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(_)))

Por cierto, ¿cuál será la diferencia en el consumo de memoria en comparación con el uso clásico de Java InputStream / OutputStream? De hecho, puedo reenviar un archivo de 500 mb a S3 de forma no bloqueante, con un consumo de memoria muy bajo, sin usar Iteratees, usando Java + AsyncHttpClient + Grizzly (pero creo que también funcionaría con Netty).

Entonces, ¿cuál es la ventaja de usar Iteratee?

Una diferencia que puedo ver es que el InputStream que recibo y reenvío a S3 en mi caso está respaldado por un archivo temporal (este es un comportamiento CXF), por lo que puede que no sea tan reactivo como Play Iteratee

Pero con Iteratees, si el Enumerador produce bytes recibidos por la conexión y los reenvía a S3 a través de un Iteratee, entonces si la conexión a S3 no es buena y los bytes no se pueden reenviar muy rápidamente, donde se almacenan los bytes "pendientes" ?

Respuestas a la pregunta(1)

Su respuesta a la pregunta