在JSF 2.0.9,Weblogic
10.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>
如果设置STATE_SAVING_METHOD
为,则server
在故障转移时会收到viewexpired异常。如果我设置为client
同PARTIAL_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
- client
&PARTIAL_STATE_SAVING
- false
我要进行故障转移的唯一方法吗?提前致谢。
我终于可以正常工作了,但并非没有多余的东西。首先,我在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
在会话中保存状态的只会被添加一次,而不会再被删除/添加/替换。因此,尽管在本地会话中对其进行了更新,但这些更改从未复制到另一个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>
希望这对遇到相同问题的人有所帮助。
对于复制,我们设置Server1作为主服务器,设置server2作为次服务器...一切正常。 期望:当server1停机时,次要的server2不会自动变成主要的。它仍然是次要的。server2也有可能自动成为主服务器。 情况2:MongoDB复制是否需要3台强制服务器,以便当server1宕机时,server2将自动成为主要服务器,server3将保持次要服务器。(这很管用)
我们在Aurora集群中使用MySQL,我们有两个实例--主实例和从实例。我们在c3po连接池上处理spring事务。我们使用的是mariadb jdbc驱动程序(版本2.2.3)。
问题内容: 在简单情况下,如果3台服务器具有1个主服务器和2个从属服务器而没有分片。是否有使用Java和Jedis的经过验证的解决方案,该解决方案没有单点故障,并且将自动处理单个服务器(无论是主服务器还是从服务器)(自动故障转移)。例如,提升主机并在故障后重置,而不会丢失任何数据。 在我看来,这似乎应该是一个已解决的问题,但是我找不到关于它的任何代码,而仅是对实现此方法的高级描述。 谁实际覆盖并在
我们使用MQ作为传递消息的主要路径。这是我们的制度运作不可或缺的一部分。消息代理有时会失败,所有相关的队列也会随之失败。在camel中,有没有一种方法可以启动故障切换,并在其启动时恢复到主故障切换?
我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运
我试图设置一个简单的,并将其配置为将主服务器故障转移到从服务器。 我设置了4个VM(使用),每个VM上都安装了redis。我有一个主机器和两个奴隶。最后一台机器是哨兵。 主服务器和从服务器都有默认配置,只是我将绑定地址更改为,而从服务器有行。 在哨兵中,我遵循了基本教程,并放入了以下设置: 我做错了什么?