我已经看到很多类似案例,但是我相信我的问题可能有所不同。我已经找到了原因,但是还没有找到解决方法。我在三个不同区域的CICS中运行3个自由服务器,所有服务器都使用相同的捆绑包启动Web应用程序。该Web应用程序可以完全正常运行并且运行良好,但是当所有三个服务器都在三个不同区域中启动并运行时,该应用程序将获得ViewExpiredException。我已经证明,这是通过关闭两台服务器并尝试复制问题而没有成功而发生问题的原因。
关于我的代码,如果需要,我可以发布任何代码。就像我说的那样,该应用程序可以100%运行,但是仅当一台服务器正在使用它时才可以。我的所有方法类都是会话作用域的,除了数据库操作类是应用程序作用域的。我相信工作负载管理会导致当前会话偶尔在服务器之间跳转,并且这样做会导致错误。如果有人知道如何解决此问题,我将非常感激。非常感谢!
编辑:我正在发布堆栈跟踪。
Caused by: javax.faces.application.ViewExpiredException: /main.xhtml - No saved view state could be found for the view identifier: /main.xhtml
at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:183)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:196)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:143)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1255)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:743)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:440)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1156)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1004)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:76)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:921)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:281)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:960)
at com.ibm.cics.wlp.impl.CICSHttpRunnable.run(CICSHttpRunnable.java:244)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.runWork(CICSTaskWrapper.java:701)
at com.ibm.cics.wlp.impl.CICSTaskWrapper.run(CICSTaskWrapper.java:386)
答案 0 :(得分:0)
我想我可能已经找到了解决方案。此问题可能是由于状态保存方法设置为服务器。我已将其添加到代码的web.xml中:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
据我所知,由于应用程序在服务器之间跳转,因此发生异常是因为状态保存方法是服务器端的,因此当我们访问另一台服务器时,它会丢失。将方法更改为客户端可能会解决此问题。
我目前正在尝试复制该问题。如果无法这样做,我将选择它作为解决方案。