8.12. 対話型コンポーネントへの同時呼び出し
Seam コンポーネントへの同時呼び出しに関する一般的な説明は 「同時実行モデル」 でご覧ください。本項では、同時実行が発生する最も一般的な状況について説明します (AJAX 要求から対話型コンポーネントにアクセスする場合)。また、 クライアントで発生したイベントの制御に Ajax クライアントライブラリが提供するオプションについて説明してから RichFaces で提供されるオプションについて見ていきます。
対話型コンポーネントでは実際の同時アクセスは許可されないため、 Seam は各要求を連続的に処理するようそれぞれを待ち行列に入れます。 これにより各要求は確定的に実行されます。 ただし、シンプルなキューにはいくつか制限があります。なんらかの理由でメソッドが完了するまでに時間がかかる場合、 クライアントが要求を生成するたびにそれを実行すると DoS 攻撃を招く恐れがあります。多くの場合、AJAX を使用してユーザーにステータスのクィックアップデートを提供するため、アクションを長時間実行し続けるのは実用的ではありません。
したがって、 長期実行の対話の内側で作業する場合は Seam は一定期間アクションイベントを待ち行列に入れます (同時要求タイムアウト)。 タイムアウトまでに Seam がイベントを処理できないと一時的な対話を作成してユーザーにタイムアウトを知らせるメッセージを表示します。このため、 AJAX イベントでサーバーを溢れさせないようにすることが重要です。
components.xml で同時要求のタイムアウトに (ミリ秒単位で) 適切なデフォルトを設定することができます。
<core:manager concurrent-request-timeout="500" />
<core:manager concurrent-request-timeout="500" />
また、 ページごとに同時要求のタイムアウトを調整することもできます。
<page view-id="/book.xhtml" conversation-required="true"
login-required="true" concurrent-request-timeout="2000" />
<page view-id="/book.xhtml" conversation-required="true"
login-required="true" concurrent-request-timeout="2000" />
ここまではユーザーに対して連続的に出現する AJAX 要求について説明してきました。 クライアントはサーバーにイベントが発生したことを伝え、 その結果に応じてページの一部を再レンダリングします。 この方法は AJAX 要求が軽量である場合は十分ですが (1 列内の数字の合計を計算するなど呼び出されるメソッドがシンプルである場合)、 計算が複雑となる場合には別の方法が必要です。
クライアントがサーバーに AJAX 要求を送信しこれによりサーバーで非同期にアクションが直ちに開始するような場合にはポーリングベースの方法を使用してください。 アクションが実行されている間、 クライアントは更新に対しサーバーをポーリングします。 長期実行のアクションの連続でいずれのアクションもタイムアウトさせないようにすることが重要な場合はこの方法を使用した方が賢明です。
8.12.1. 対話型 AJAX アプリケーションを設計する方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
まず、より簡単な「連続」要求の方法とポーリングの方法のどちらを使用するのかを決める必要があります。
連続 要求を選択する場合は、 要求が完了するまでに要される時間を推測する必要があります。前項で説明したようにこのページに対する同時要求のタイムアウトを変更する必要があるかもしれません。要求がサーバーを溢れさせないようにするためサーバー側での行列待ちがおそらく必要となります。 イベントが頻繁に発生し (入力フィールドの keypress や onblur など) クライアントの即時更新が優先事項ではない場合は、クライアント側で要求の遅延を設定してください。 要求遅延の作業を行う場合、サーバー側でも行列待ちできることを考慮に入れてください。
最後に、クライアントライブラリは未完了の重複要求を最新のものは後に残してすべて停止するオプションを備えています。
ポーリングの方法を使用する場合は細かな調整はあまり必要ありません。 アクションメソッド
@Asynchronous をマークしてポーリングの間隔を決定するだけです。