0

私は Play 2.1.2 を使用していますが、これに問題があり、Enumeratorこれをデバッグする方法についてのアイデアを探しています。

サーバー経由で S3 データをストリーミングしようとしています。InputStreamAmazon 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は、これを行うためのエレガントな方法のように思えました...うまくいけば。

提案?

4

1 に答える 1