我正在JBoss EAP 6上使用PrimeFaces 3.4.2和CDI创建一个JSF 2应用程序。该应用程序有一个使用长时间运行对话的部分,共3页。当用户导航到使用对话的第一个页面时,他们有两个链接到其他页面。
<p:commandLink action="#{event.navigateToIfg()}" >
<h:outputText value="#{msg.ifg_label}" />
</p:commandLink>
<p:commandLink action="#{event.navigateToJob()}" >
<h:outputText value="#{msg.job_label}"/>
</p:commandLink>
两种方法都使用导航规则在页面之间移动。
navigateToIfg()使用规则:
<navigation-rule>
<from-view-id>/event/event.xhtml</from-view-id>
<navigation-case>
<from-outcome>TO_IFG</from-outcome>
<to-view-id>/event/eventGuideIfg.xhtml?cid=# {javax.enterprise.context.conversation.id}</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
navigateToJob()使用规则:
<navigation-rule>
<from-view-id>/event/event.xhtml</from-view-id>
<navigation-case>
<from-outcome>TO_JOB</from-outcome>
<to-view-id>/event/eventGuideJob.xhtml?cid=#{javax.enterprise.context.conversation.id}</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
该应用程序还有一个全局的on click javascript侦听器,它触发一个p:remoteCommand,通知会话作用域bean发生了单击。因此,当用户尝试导航到IFG或JOB时,也会触发以下操作。
<p:remoteCommand id="keepAliveRemoteCommand" name="keepAliveRC" actionListener="#{sessionInfo.keepAlive()}" autoRun="false" update="@none" process="@this" />
我相信导航和点击侦听器紧密结合导致我得到警告:
WELD-000315获取会话锁定失败id: 1的会话
会导致应用程序中的其他异常和失败。最后,问题并不总是一致的,有时它会立即发生,有时它不会使用相同的步骤发生。我需要了解我做错了什么,以及如何解决这个问题。
更新:
有人能解释这个警告吗?这是什么意思?具体是如何引起的?我的JSF应用程序似乎无法控制它。在这种情况下,JBoss EAP 6 (JBoss AS 7.1.3)似乎是针对web应用程序的。
在获得有关WELD-000315错误含义的更多信息之后,我确定错误的原因是我为用户进行的每次单击触发了一个全局单击侦听器。
ajax的点击请求总是将会话id附加到请求上,这导致它在另一个请求运行时间超过1秒时尝试锁定会话。问题发生在耗时超过1秒的请求上,比如导航到不同的页面,或者长时间的保存请求。为了解决这个问题,我所要做的就是更具体地说明何时启动点击侦听器。