Java JSF会话故障转移和部分状态保存

Java JSF会话故障转移和部分状态保存,java,jsf,weblogic,Java,Jsf,Weblogic,在JSF2.0.9、WebLogic10.3.4上运行。我们现在在生产环境中运行JSF,但在会话复制和故障转移方面遇到了一些问题。我们正在为bean使用viewscope,我已经确保它们是可序列化/瞬态的,并且瞬态变量实际上是无状态的。但是,会话故障转移不起作用。我已经做了大量的测试,并通过在web.xml中设置以下参数使其正常工作 <context-param> <param-name>javax.faces.STATE_SAVING_METHO

在JSF2.0.9、WebLogic10.3.4上运行。我们现在在生产环境中运行JSF,但在会话复制和故障转移方面遇到了一些问题。我们正在为bean使用viewscope,我已经确保它们是可序列化/瞬态的,并且瞬态变量实际上是无状态的。但是,会话故障转移不起作用。我已经做了大量的测试,并通过在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>
所以我的问题是:

  • 状态保存方法
    -
    客户端
    &
    部分状态保存
    -
    错误
    是我让故障切换工作的唯一方法吗
  • 客户/虚假组合的成本是多少。这是内存/cpu扩展吗
  • 这是一个bug吗?如果是,它是在2.1还是2.2中解决的

提前感谢。

会话复制应该由负载平衡器处理,因为JSF应用程序只知道它部署到的节点上的上下文。因此,将STATE\u SAVING\u方法设置为client或server并不重要

我觉得您的负载平衡器配置不正确。如果使用Apache HTTP Server作为代理,请参阅以下链接以了解有关会话粘性的更多信息:


我建议设置ProxySet stickysession=ROUTEID,看看这是否解决了问题。

我最终实现了这一点,但没有一些额外的位和BOB。首先,我在web.xml中添加了以下内容(yes agressive拼写错误):

这只是在每个请求之后替换属性,并确保它可以复制。另外,我用以下内容限制视图中存储的数据:

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

com.sun.faces.numberofviewsin会话
3.
com.sun.faces.numberofLogicalView
1.

希望这能帮助有同样问题的人。

我们有IIS。会话复制由weblogic而不是负载平衡器处理。粘性会话已启用,但这不是问题所在。问题是会话无法正确地故障转移到新jvm。如果您在weblogic服务器上设置了sticky session,weblogic服务器将创建一个cookie,其中仅包含该节点上的用户会话信息。我的猜测是,当发生故障转移时,这个cookie不会传递给第二个节点,因为weblogic实例只知道自己。这就是为什么我说你应该尝试在负载平衡器上打开粘性会话,因为负载平衡器能够将cookie传递给第二个节点。谢谢,但我认为我在最初的问题中没有说清楚。会话复制正在发生,但JSF会话并不正确。我们的应用程序只有一部分在mo中使用JSF,非JSF会话正在复制中。太棒了,谢谢!我做了所有这些,但它完全不起作用幸运的是,这个bug已经存在很长时间了。从这里可以明显看出,已经多次向开发人员指出:基本上
AttachedObjectListHolder.restoreState
是基于错误的假设编写的,开发人员拒绝修复它。相反,他们坚持要求您以不同的方式编写代码
    <context-param>
        <param-name>com.sun.faces.enableAgressiveSessionDirtying</param-name>
        <param-value>true</param-value>
    </context-param>
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>