2012-08-23 99 views
10

JSF 2.0.9、Weblogic 10.3.4で動作します。現時点では、本番環境でJSFを実行していますが、セッション複製とフェイルオーバーに関する問題が発生しました。私たちは豆のためにビュースコープを使用しています。私はそれらがシリアライザブル/トランジェントであることと、一時的な変数が効果的にステートレスであることを保証しています。ただし、セッションフェイルオーバーは機能しません。私は、広範なテストを行って、それは私がserverからSTATE_SAVING_METHODは、私がフェイルオーバーにviewexpired例外を取得した場合のweb.xmlJSFセッションのフェールオーバーと部分的な状態の保存

<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> 

で次のparamsを設定することにより、作業を取得するために管理しています。私はtruePARTIAL_STATE_SAVINGclientに設定した場合、私は次のエラーを取得する:

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です - client & PARTIAL_STATE_SAVING - 私はするつもりだfalse唯一の方法フェイルオーバーを機能させるには?
  • クライアントと偽の組み合わせのコストはいくらですか?このメモリ/ CPUは豊富ですか?
  • これはバグですか?そうであれば、それは2.1または2.2で解決されますか?

ありがとうございます。

答えて

12

私はついにこの作業をしましたが、余分なビットとボブがありませんでした。まず、私は(はい攻撃的に間違って綴られる)web.xmlに以下を追加しました:

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

クライアント省は、サーバーと部分的ステートセーブはまだ(動作しません。単に真)偽である今ある

次に、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> 

これは同じ問題で誰にもお役に立てば幸いです。

0

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

ロードバランサの設定が正しくないように聞こえます。あなたのプロキシとしてApache HTTP Serverを使用している場合は、セッションstickynessの詳細については、以下のリンクを参照してください。

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

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

+0

私たちはIISを持っています。セッションの複製は、ロード・バランサではなくweblogicによって処理されます。スティッキセッションはオンですが、これは問題ではありません。問題は、セッションが新しいjvmに正しくフェールオーバーできなかったことです。 – andyfinch

+0

weblogicサーバでスティッキセッションを設定している場合、weblogicサーバは、そのノード上のユーザセッション情報を持つクッキーを作成します。私の推測では、weblogicインスタンスはそれ自体を認識しているだけなので、フェイルオーバーが発生したときにこのクッキーが2番目のノードに渡されることはありません。そのため、ロード・バランサがクッキーを2番目のノードに渡すことができるため、Load Balancerでスティッキー・セッションを有効にしてください。 –

+0

ありがとうございますが、私は私の最初の質問で私がはっきりしていたとは思わない。セッションの複製は行われていますが、JSFセッションでは正しく動作しません。私たちのアプリの一部だけが、moおよびnon jsfセッションでJSFを使用しています。 – andyfinch

関連する問題