私は Play 2.1.2 を使用していますが、これに問題があり、Enumerator
これをデバッグする方法についてのアイデアを探しています。
サーバー経由で S3 データをストリーミングしようとしています。InputStream
Amazon SDK から S3 ファイルのを取得できます ( getObject(bucket, key).getObjectContent()
)。次に、それをusingInputStream
に変換します。Enumerator[Array[Byte]]
Enumerator.fromStream
このタイプはすべてチェックされ、私のローカル開発マシンではすべて完全に機能します。Result
私が自分のインプレイを定式化するとき、私は単に を返しOk.stream(enum)
ます。
これを本番サーバーにデプロイすると問題が発生します。初めてファイルをリクエストしたとき、問題なく動作し、ファイル全体を取得しました。しかし、その後は頻繁に途中で (毎回異なる量)、「スタック」します。Enumerator
列挙が完了したかどうかをログに記録できるように、次のようにラップしました。
val wrapped = enum.onDoneEnumerating { println("Contents fully enumerated"); }
Ok.stream(wrapped);
予想どおり、私の開発マシン (および本番マシンで初めて) で、「コンテンツが完全に列挙されました」というメッセージが表示されます。しかしその後、本番マシンはファイルのダウンロードを開始しますが、終了しません (HTTP の意味でもEnumerator
意味でも)。
これをデバッグする方法がわかりません。明らかに、fromStream
いくつかの魔法を行いますが、チャンク間で何が起こっているのかを理解する方法がわかりません。これはスレッド プールの問題かもしれないと思ったので、応答全体をfuture { blocking { ... } }
ブロックにラップしましたが、違いはないようです。
S3 からローカル一時ファイルを作成し、そこからビルドする手間を省こうとしていますEnumerator
。を使用してfromStream
を作成するのEnumerator
は、これを行うためのエレガントな方法のように思えました...うまくいけば。
提案?