2

次のコードを含む JSF ページがあります。

...
<f:event type="preRenderView" listener="#{page1.PreRenderViewEvent}"/> 
...

ここで、リスナー (Page1.PreRenderViewEvent メソッド)をページではなく、 Page1クラス コンストラクター内に登録する必要があります。次のようなものです。

...
UIViewRoot root = FacesContext.getCurrentInstance().getViewRoot();
root.getListenersForEventClass(javax.faces.event.PreRenderViewEvent.class).add ....
...

このコードを完成させるにはどうすればよいですか?
ありがとう。


オペレーティング システムによって異なります。スピン、スピンyield、カーネルの汎用条件変数、ユーザーランド制御のスケジューリング、およびカーネルサポートを備えた特殊なロックプリミティブを見てきました。

スピニングとスピニングyieldはひどいパフォーマンスをしています。理論的には、ユーザーランドで制御されたスケジューリング (「スケジューラーのアクティベーション」を参照) が最高のパフォーマンスを発揮するはずですが、私の知る限り、すべてのケースで適切に機能させた人はいません。カーネルの汎用条件変数と、カーネルをサポートする特殊なロック プリミティブは、後者の最良の例として、Linux のfutexとほぼ同じように機能するはずです。

回転によりパフォーマンスが向上する状況があります。Solaris では、カーネル内の一部のロック プリミティブに、ロックを保持しているプロセスが別の CPU で実行されている限り、ロックが回転する適応モードがあります。ロックの所有者がスリープ状態になるか、プリエンプトされると、ロック ウェイターもスリープ状態になります。他のカーネルには、ロックを保持しているときにロックの所有者がプリエンプトまたはスリープできないクラスのロックがあるため、そのような場合でもスピンはうまく機能します。ただし、一般的に、特にユーザーランドでは、スピンには非常に恐ろしい縮退ケースがあり (ロック所有者を実行させるためにプリエンプトされるまでスピンプロセスがスピンします)、パフォーマンスが非常に悪くなります。のような特殊なロック プリミティブはfutex、このような最適化を実装できることに注意してください。これは、汎用の条件変数では通常できないことです。

4

1 に答える 1

5

を使用しUIViewRoot#subscribeToViewEvent()ます。

context.getViewRoot().subscribeToViewEvent(PreRenderViewEvent.class, new MySystemEventListener);

GET リクエスト中に発生するように、レンダリング レスポンス フェーズ中にBean が構築された場合、これは遅すぎることに注意してください。リクエスト スコープ Bean 自体のコンストラクター内で (または、クリーナーで) まさにその仕事をしたほうがよいでしょう@PostConstruct

于 2013-02-26T13:51:14.577 に答える