私はWebアプリケーション用にSpring MVC 3 + Tilesを使用しています。私は操作が遅く、待ってください。Spring MVC + Apache Tilesのページをお待ちください
私の知っていること、ページをお待ちくださいするには、2つの主要なアプローチがあります。
- 長期性の要求:レンダリングとページのビットを「お待ちください」フラッシュが、要求を完了していないが、アクションが終了するまで、あなたはいくつかのjavascriptを使ってレスポンスの残りの部分をストリームアウトして、ページをリダイレクトまたは更新することができます。
- すぐに戻り、バックグラウンドスレッドで処理を開始します。クライアントはサーバーをポーリングし(JavaScriptやページの更新を介して)、バックグラウンドスレッドが終了するとリダイレクトされます。
(1)それはすべてのシングルスレッド動作を続けるといいですが、ページを組み立てて、クライアントに返される前に、各JSPがフルにレンダリング完了しなければならないとして、タイルでは可能ていないようです。
私は(2)の実装を開始しました。私の実装では、最初の要求は、@Async
注釈を使用して、Future<Result>
を返すバックグラウンドスレッドで操作を開始します。その後、ユーザーに「しばらくお待ちください」というページが表示され、数秒ごとに更新されます。
待機待ちページがリフレッシュされると、コントローラはバックグラウンドスレッドの進行状況を確認する必要があります。これを行う最善の方法は何ですか?
- 私が
Future
オブジェクトをセッションに直接配置すると、ポーリング要求スレッドはスレッドをプルアウトしてスレッドの進行状況を確認できます。しかし、これは私のセッションがシリアライズ可能でないことを意味しないので、私のアプリは複数のWebサーバー(スティッキーセッションを必要とせずに)でデプロイできませんか? - 私はセッションに何らかの種類のステータスフラグを入れて、終了時にバックグラウンドスレッドがセッションを更新するようにすることができます。私は非常にHttpSessionオブジェクトを非要求スレッドに渡すと、エラーをデバッグするのが難しくなることに非常に懸念しています。これは許可されていますか?誰でもどのような文書を引用することができますか?セッションがメモリ内にある場合はうまく動作しますが、セッションがデータベースに格納されている場合はどうなりますか?複数のWebサーバーがある場合はどうなりますか?
- 私は自分のデータベースにセッションフラグを設定したり、セッションIDをキーにしたり、遅い操作の何か他の側面を置くことができます。私のドメインデータベースにはセッションデータがありません。セッションではなく、少なくとも私はデータベースがスレッドセーフであることを知っています。
- もう一つの選択肢はありますか?
私は答えを(2)最初のリストから要約し、(3)を2番目のリストから要約するのは正しいですか?データベースにセッションスコープのデータがあるという主な問題が1つあります。データベースは自動的にセッションスコープではないため、デッドセッションデータをデータベースで定期的にチェックして削除するクリーンアップジョブを追加する必要があります。 2番目のリストから(2)が実行可能であると思いますか?要求されていないスレッドからSessionオブジェクトにアクセスすることが安全かどうかの証拠はありますか?スコープの不一致を避けることができます。 – Rich
私は2-3に固執し、2-2に固執しません。私はセッションを更新しません。私はこれがまったく不可能だとは思わない。セッション1はサーバ1上でアクティブであり、サーバ2上のバックグラウンドスレッドもセッションを変更したいと言います。これは不可能です。 – ChrLipp
通常、このアーキテクチャは次のようなものです。期間が3分未満の場合、オンラインでアクションを実行します。長い実行アクションがある場合は、その要求をデータベースに格納し、バッチスケジューラから処理させます。スケジューラーは追加のサーバー上で実行できます。セッションに何も保存する必要はありません。 – ChrLipp