15

jsfプロジェクトのページをナビゲートしているときにBusyConversationExceptionが発生します。これは主に、ユーザーがajax呼び出し中に別のページに移動しようとした場合に発生します。これは、ユーザーがページの読み込みを待たずに別のリンクをクリックした直後にリンクをクリックした場合にも発生します。

たとえば、ユーザーが以下のようなコードを介して生成された複数のリンクをクリックすると、間違いなくこの例外が発生します。別の例は、ユーザーがテキストフィールドにクエリを入力し、アプリケーションがこのクエリを検索するためにajax呼び出しを行うとします。そのクエリ中に、ユーザーがボタンをクリックして別のページに移動すると、BusyConversationExceptionも発生します。

<h:commandLink value="#{theProfile.profileName}"
               title="#{theProfile.profileName}"
               action="#{profileBean.aProfileSelected}">
               <f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/>
</h:commandLink>

このタイプの例外は、ExceptionHandlerWrapperクラスを拡張するExceptionHandlerクラスでキャッチできますが、現在の状態を保存できません。この場合にできる最善の方法は、この例外が発生したときにメインページにリダイレクトすることです。

これを回避するための解決策はありますか?回答とコメントを事前に感謝します。

4

4 に答える 4

2

他の回答で述べたように、これは ajax リクエストがまだ処理されている場合、または送信中の commandLink または commandButton が実際にクリックされる前に ajax イベントがトリガーされた場合 (たとえば、入力フィールドの変更イベントによって) に発生します。

したがって、AJAX イベントは伝播によってトリガーされないため、 BusyConversationExceptions を で回避することはできません。onclick="preventEventPropagation(event)";

この問題は、実行中の ajax リクエストをリッスンし、保留中の ajax イベントが完了するまで送信をブロックすることで簡単に回避できます。

この問題と解決策については、このブログ投稿JSF2 AJAX/Submit conversation issueで詳しく説明されています。

于 2015-03-04T08:46:06.787 に答える
0

私はこれを見つけました、

同時要求が同じ会話コンテキストに関連付けられているため、コンテナーが要求を拒否したことを示します。

コンテナーは、同時要求をブロックまたは拒否することにより、長時間実行される会話が一度に最大 1 つの要求に関連付けられることを保証します。コンテナーが要求を拒否した場合、要求を新しい一時的な会話に関連付け、JSF ライフサイクルの復元ビュー フェーズから BusyConversationException タイプの例外をスローする必要があります。

ここを参照

于 2013-04-22T04:29:23.837 に答える
-1

をクリックしていたときも、同じ問題に直面しました。

私は本の 1 つを読んだことがありますが、busyConevrsation はそのイベントで 2 つのアクションが発生しているonclick="preventEventPropagation(event)";ため、そのクリックのイベントの伝播を防ぐために commandLink で : を使用すると言いました。だから私は同じものを使用しており、それは私のために働いています。

だから今、BusyConversationException を取得していません:)

于 2015-01-06T09:29:57.463 に答える
-1

これもたまに見かけます。会話へのアクセスをシリアル化することに力を入れるのは良い考えだと思い始めています。

  1. ターゲット ビューに会話インスタンスが必要ない場合は、会話 ID (cid) を伝達しないでください。具体的には、無関係なナビゲーション リンク/ボタンは cid パラメータを抑制する必要があります (正確な方法については考えていません)。
  2. アクティブな会話を使用するリクエストを開始するときは、会話を伝播する他の UI 要素を無効にします。これにより、同時アクセスが発生する可能性があります。PrimeFaces または (さらに良い) PrimeFaces Extensions の blockUI コンポーネントは、半透明のオーバーレイとしてうまく機能し、PrimeFaces の p:ajaxStatus を使用してビジー ステータスを表示します。
  3. 会話はできるだけ遅く始めましょう。これにより、長時間の会話が伝播されるケースが最小限に抑えられます。

ただし、これが完全な解決策であるとは思いません。cid がロケーション バーに表示されるとすぐに (会話がアクティブなときにフォームの ajax 以外のポストバックを行うと発生します)、複数のタブが原因でその会話へのアクセスのタイミングを制御できなくなる可能性がありますウィンドウ、ブックマークなど

于 2012-12-04T22:55:06.050 に答える