13

JSF 2.0.9、Weblogic10.3.4で実行されます。現在、実稼働環境でJSFを実行していますが、セッションレプリケーションでいくつかの問題が発生し、フェイルオーバーが発生しました。Beanにはビュースコープを使用しており、それらがシリアル化可能/一時的であり、一時変数が事実上ステートレスであることを確認しました。ただし、セッションフェイルオーバーは機能していません。私は広範なテストを行い、web.xmlで次のパラメータを設定することでそれを機能させることができました

    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>


    <context-param>
        <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
        <param-value>false</param-value>
    </context-param>

に設定STATE_SAVING_METHODするserverと、フェイルオーバー時にviewexpired例外が発生します。clientwithPARTIAL_STATE_SAVINGに設定するとtrue、次のエラーが発生します。

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1433)
    at com.sun.faces.application.view.StateManagementStrategyImpl$1.visit(StateManagementStrategyImpl.java:265)
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1507)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1521)
    at com.sun.faces.component.visit.VisitUtils.doFullNonIteratingVisit(VisitUtils.java:75)
    at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:282)
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:181)
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:448)
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:187)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

だから私の質問はこれらです:

  • STATE_SAVING_METHOD- clientPARTIAL_STATE_SAVING-falseフェイルオーバーを機能させる唯一の方法はありますか?
  • クライアント/偽の組み合わせのコストはいくらですか。このメモリ/CPUは大容量ですか?
  • これはバグですか?もしそうなら、2.1または2.2で解決されていますか?

前もって感謝します。

4

2 に答える 2

14

私は最終的にこれを機能させましたが、いくつかの追加のビットとボブがないわけではありません. まず、web.xml に以下を追加しました (はい、アグレッシブのスペルが間違っています)。

    <context-param>
        <param-name>com.sun.faces.enableAgressiveSessionDirtying</param-name>
        <param-value>true</param-value>
    </context-param>

クライアントの保存はサーバーになり、部分的な状態の保存はまだ false (true は単に機能しません)

次に、HttpSessionAttributeListener を実装した後com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap、セッションの状態を保持する が一度だけ追加され、削除/追加/置換されないことがわかりました。したがって、ローカル セッションで更新されていましたが、これらの変更が 2 番目の jvm に複製されることはありませんでした。Weblogic ドキュメントでは、レプリケーションを機能させるには、セッション属性で setAttribute を呼び出す必要があると記載されています。これを修正するために、次のようにフェーズ リスナーを作成しました。

public class ViewPhaseListener implements PhaseListener {

    public void afterPhase(PhaseEvent phaseEvent)
    {

    }

    public void beforePhase(PhaseEvent phaseEvent)
    {
        HttpServletRequest request = ((HttpServletRequest) phaseEvent.getFacesContext().getExternalContext().getRequest());
        HttpSession session = request.getSession();

        session.setAttribute("com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap", session.getAttribute("com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap"));

    }

    public PhaseId getPhaseId()
    {
        return PhaseId.RENDER_RESPONSE;
          //To change body of implemented methods use File | Settings | File Templates.
    }
}

これにより、各リクエストの後に属性が置き換えられ、確実に複製されます。追加のポイントとして、ビューに保存されるデータを次のように制限しています。

<context-param>
        <param-name>com.sun.faces.numberOfViewsInSession</param-name>
        <param-value>3</param-value>
    </context-param>

    <context-param>
        <param-name>com.sun.faces.numberOfLogicalViews</param-name>
        <param-value>1</param-value>
    </context-param>

これが同じ問題を抱えている人に役立つことを願っています。

于 2013-04-12T09:40:44.783 に答える
0

JSF アプリケーションはデプロイ先のノードのコンテキストしか認識しないため、セッション レプリケーションはロード バランサーによって処理される必要があります。そのため、 STATE_SAVING_METHOD をclientまたはserverに設定しても問題ありません。

ロードバランサーの設定が間違っているように思えます。プロキシとして Apache HTTP Server を使用している場合は、次のリンクを参照してセッション スティッキーの詳細を確認してください。

http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

ProxySet stickysession=ROUTEIDを設定して、問題が解決するかどうかを確認することをお勧めします。

于 2012-09-06T17:25:39.710 に答える