Web アプリケーションに Spring MVC 3 + Tiles を使用しています。動作が遅いので、お待ちくださいページが欲しいです。
私が知っているページを待ってくださいには、主に2つの方法があります。
- 長時間のリクエスト: ページの「お待ちください」ビットをレンダリングしてフラッシュしますが、アクションが終了するまでリクエストを完了しないでください。アクションが終了したら、JavaScript を使用して残りのレスポンスをストリーミングしてリダイレクトするか、ページを更新します。
- すぐに戻り、バックグラウンド スレッドで処理を開始します。クライアントはサーバーを (javascript またはページの更新によって) ポーリングし、バックグラウンド スレッドが終了するとリダイレクトします。
(1) はアクションをすべてシングル スレッドに保つため優れていますが、ページがアセンブルされてクライアントに返される前に各 JSP が完全にレンダリングを完了する必要があるため、Tiles では可能ではないようです。
そこで、(2) の実装を開始しました。@Async
私の実装では、最初のリクエストは、Spring のアノテーションを使用して、バックグラウンド スレッドで操作を開始しますFuture<Result>
。次に、数秒ごとに更新される「お待ちください」ページをユーザーに返します。
お待ちくださいページが更新されると、コントローラーはバックグラウンド スレッドの進行状況を確認する必要があります。これを行う最善の方法は何ですか?
- オブジェクトをセッションに直接配置
Future
すると、ポーリング要求スレッドはそれを引き出して、スレッドの進行状況を確認できます。しかし、これは私のセッションがシリアライズ可能ではないということではないのでしょうか? - セッションにある種のステータス フラグを設定し、終了時にバックグラウンド スレッドにセッションを更新させることができます。HttpSession オブジェクトを非要求スレッドに渡すと、デバッグが困難なエラーが発生することを非常に懸念しています。これは許されますか?どちらの方法でも、誰かがドキュメントを引用できますか? もちろん、セッションがメモリ内にある場合は問題なく動作しますが、セッションがデータベースに保存されている場合はどうなるでしょうか? 複数の Web サーバーがある場合はどうなりますか?
- セッション ID、または遅い操作のその他の側面に基づいて、データベースにある種のステータス フラグを設定できます。セッション データではなく、ドメイン データベースにセッション データがあるのは奇妙に思えますが、少なくともデータベースがスレッド セーフであることはわかっています。
- 私が逃した別のオプションはありますか?