5

Playである種の進行状況インジケーターを実装するための最良の方法は何ですか?

ユーザーがcsvファイルをアップロードできる簡単なインポートページがあります。その後、サーバーは、インポートが完了するまで、ある程度の長い処理を実行します。アップロード後にユーザーを別のページにリダイレクトし、このページに関する継続的なフィードバックを提供したいと思います。「インポートされた856データセットのうち150」です。

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

4

2 に答える 2

3

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

つまり、CSVファイルを処理することで、ジョブが実行されます。次のステップは、各データセットがいつ処理されたかを記録することです。したがって、クライアントに返すuidや一意の番号などの参照をジョブに渡すと仮定します。次に、一意のIDに対して処理されたデータセットの数の各増分を(ステートレスに準拠して簡単にスケーリングしたい場合は、おそらくデータベースに)記録する必要があります。

例えば

@Entity
public class DatasetProgress extends Model {

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

}

次に、uidに基づいてDatasetProgressオブジェクトを返すコントローラーアクションを作成できます。これを使用して、進行状況バーを表示できます。

于 2012-06-19T17:07:47.247 に答える
1

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

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

于 2012-06-19T16:44:30.747 に答える