2012-06-19 19 views
5

Playに何らかの進捗インジケータを実装する最良の方法は何ですか?Playフレームワークの進捗インジケータ

ユーザーがcsvファイルをアップロードできる簡単なインポートページがあります。サーバーは、インポートが完了するまで、いくつかの処理を実行します。アップロードした後に別のページにリダイレクトして、このページにフィードバックしていただきました。 "150個のデータセットがインポートされました。"

アップロードアクションによってコントローラメソッドがトリガされ、時間のかかるタスクを独自のスレッドで開始できますが、別のページからのajax呼び出しでジョブのステータスを取得するにはどうすればよいですか?リクエスト間の状態)?

答えて

3

コントローラからジョブを作成する可能性があります。 Playのドキュメントを読んでいる場合は、ジョブで長時間実行されている処理を実行して、HTTPリクエストスレッドを貪欲にしないようにすることをお勧めします。

CSVファイルを処理することで、ジョブが実行されています。次のステップは、各データセットがいつ処理されたかを記録することです。したがって、あなたの仕事にあなたのクライアントに渡すuidや固有の番号のような参照を渡すと仮定します。ユニークなIDに対して処理されたデータセット数の増分を、ステートレス性に合わせて簡単に拡大したい場合は、データベースに記録するだけで済みます。例

@Entity 
public class DatasetProgress extends Model { 

    public Long uid; 
    public Long datasetsDone; 
    public Long datasetsTotal; 

} 

あなたは、あなたはプログレスバーを表示するために使用することができ、あなたのUIDに基づいてDatasetProgressオブジェクトを返すコントローラのアクションを作成することができるため

1

あなたができることの1つは、集中通知をすることです。インポートにいくつかの一意の識別子を与え、このIDでキー入力された更新メッセージを書き込むことができます。ステータスを取得するには、そのキーを使用します。

もう1つの選択肢は、ウェブソケットを使用して、基本的に通知をクライアントにプッシュすることです(ただし、まだ広くサポートされていません)。

+1

特に、WebSocketまたは少なくともCometをサポートしているブラウザを使用していることが確実であれば、Johnと@Codemwnciの両方の回答を使用したいと思います。その場合は、実際にライブのような進行状況バーを構築することができます。 – biesior

関連する問題