2011-02-04 8 views
1

Seamアプリケーションでは、ページがブラウザのウィンドウ/タブで開いたままである限り会話をアクティブに保つポーリングセクションがあります。ユーザは、複数のオブジェクトインスタンスを同時に操作することができ、会話が「非アクティブ」ページで期限切れになることなく、別のセッションでビジー状態になります。ロックを取得せずにSeamの会話が使用されていることを確認します。

すべてがうまくいきますが、ポーリングスレッドが別の1つ(長時間実行中)が進行中に要求を送信すると、毎回、次に会話例外への恐怖の同時呼び出しが発生します。 concurrent-request-timeout値はかなり高く設定されており、ほとんどの場合、ページが2秒以内に戻ってきます。しかし、ユーザーが大量のデータを処理する状況(そしてページの読み込みに時間がかかっていてもそれらのページが読み込まれるのを待っている)があるため、一般的な最適化の面ではそれほど多くはありません。

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


TLDR:縫い目の会話のロックがあるかどう任意のポインタ(つまり、会話の例外への同時呼び出しをトリガーにつながる可能性がある)、それをアクセスしようとせずに

を確認し、提案は、非常に高く評価されています。

+0

すべてのリクエストをキューに入れる方法があることはわかっていますが、これが有効な方法であるかどうかはわかりません。私は今それをどうやって行うのか覚えていない。 – Tiago

+0

どのように会話をポーリングしますか? @reistiagoによれば、キューは有効なアプローチである可能性があります。 –

答えて

1

私はあなたがSeam2を使用していると想定しています(この質問はしばらくぶらぶらしています)。

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

ConversationEntrylockNoWait()の方法で電話をかけてロックを取得することができます。エントリが別のスレッドによってロックされている場合は、すぐにfalseを返します。他のスレッドがロックを保持していない場合はtrueを返します(この場合、直接unlock()を呼び出します)。

また、会話の有効期限が切れることを避けるために、ロックについて迷惑をかけずにtouch()に電話することもできます。

お礼、 アレクサンダー。

関連する問題