1

Seam アプリには、ブラウザ ウィンドウ/タブでページが開いている限り会話をアクティブに保つポーリング セクションがあり、ユーザーは会話を行わずに複数のオブジェクト インスタンスを同時に操作できます。別のページでビジーである間に、「非アクティブ」ページで有効期限が切れます。

すべて正常に動作しますが、別のスレッド (長時間実行) の進行中にポーリング スレッドがリクエストを送信すると、恐ろしい同時呼び出しの会話例外が時々発生します。私たちは、concurrent-request-timeout の値をかなり高く (20 秒) に設定しており、ほとんどの場合、ページは 2 秒未満で戻ってきます。ただし、ユーザーが大量のデータを処理する場合 (そして、どれだけ時間がかかっても、それらのページがロードされるのを喜んで待つ場合) があるため、一般的な最適化に関して私たちができることはあまりありません。

私たちが探しているのは、特定の会話にロックがあるかどうかを (すべての要求が通過する中央フィルターで) 取得しようとせずに (ロックがある場合に例外をトリガーしないようにするため) チェックする方法です。それはすでに)。これらのバックグラウンド スレッドのいずれかを処理しているかどうかを区別する手段があります (セッション管理のためにこれを行っているため、会話は拡張されますが、セッション全体は拡張されません)。会話が既に使用されていることを確認できた場合は、その特定の時点ではそのサービスが必要ないため、このポーリング スレッドの処理をスキップできます (会話は使用されているため、期限切れの危険はありません)。


TLDR: Seam 会話にアクセスしようとせずにロックがあるかどうかを確認します (会話例外への同時呼び出しのトリガーにつながる可能性があります)。

任意のポインタ、提案をいただければ幸いです。

4

1 に答える 1

1

Seam2を使用していると思います(この質問はしばらくの間ぶらぶらしていたため)。

ConversationEntriesセッションのすべての会話にアクセスできるセッションスコープクラスがあります。電話をかけることで、すべての会話に関する情報を返すように依頼できますgetConversationEntries()

次に、各メソッドを呼び出してConversationEntryロックlockNoWait()を取得できます。falseエントリが別のスレッドによってロックされると、すぐに戻ります。他のスレッドがロックを保持していない場合は戻りtrueます(その場合は直接呼び出しますunlock())。

touch()または、会話が期限切れになるのを避けるために、ロックを気にせずに電話をかけることもできます。

よろしく、アレクサンダー。

于 2011-09-27T21:29:02.520 に答える