Prześlij strumień plików do S3 przez Iteratee z Play2 / Scala

Przeczytałem kilka rzeczy na temat możliwości wysłania pliku do S3 przez Iteratee, który wydaje się pozwalać na wysyłanie fragmentów S3 pliku w miarę ich otrzymywania i unikania OutOfMemory dla dużych plików na przykład.

Znalazłem ten post SO, który prawdopodobnie jest prawie tym, co muszę zrobić:Odtwórz 2.x: Reaktywne przesyłanie plików za pomocą Iteratees Naprawdę nie rozumiem, jak to zrobić, czy też jest to naprawdę dostępne w Play 2.0.2 (ponieważ Sadek Brodi mówi, że foldM jest dostępny w Play 2.1 tylko na przykład)

Czy ktoś może to wyjaśnić w prosty sposób, dla kogoś, kto przeczytał bloga o Iteratees i nie jest jeszcze ekspertem Scala / Play2?

Nawet nie wiem, czy powinienem użyć wieloczęściowego parsera ciała, czy czegoś w tym rodzaju, ale jedno wiem, że nie rozumiem, co robi ten kod:

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

Przy okazji, jaka będzie różnica w zużyciu pamięci w porównaniu do klasycznego Java InputStream / OutputStream. Właściwie jestem w stanie przesłać plik 500 MB do S3 w sposób nieblokujący, z bardzo małym zużyciem pamięci, bez użycia Iteratees, używając Java + AsyncHttpClient + Grizzly (ale myślę, że działałoby to również z Netty).

Więc jaka jest zaleta korzystania z Iteratee?

Jedyną różnicą, jaką widzę, jest to, że wejście InputStream I do S3 jest w moim przypadku wspierane przez plik tymczasowy (jest to zachowanie CXF), więc może nie być tak reaktywne jak Play Iteratee

Ale w przypadku Iteratees, jeśli moduł wyliczający produkuje bajty odebrane przez połączenie i przekazuje je do S3 przez Iteratee, to jeśli połączenie z S3 nie jest dobre i bajty nie mogą być przekazane bardzo szybko, gdzie są przechowywane „oczekujące” bajty ?

questionAnswers(1)

yourAnswerToTheQuestion