15

我在浏览 jsf 项目中的页面时遇到 BusyConversationException。如果用户在 ajax 调用期间试图导航到另一个页面,这通常会发生。当用户在单击另一个链接后立即单击一个链接而不等待页面加载时,也会发生这种情况。

例如,如果用户点击了多个链接,这些链接是通过类似于下面的代码生成的,我们肯定会得到这个异常。另一个例子是,假设用户在文本字段中输入查询,我们的应用程序发出 ajax 调用来搜索此查询。在该查询期间,如果用户单击某个按钮导航到另一个页面,也会发生 BusyConversationException。

<h:commandLink value="#{theProfile.profileName}"
               title="#{theProfile.profileName}"
               action="#{profileBean.aProfileSelected}">
               <f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/>
</h:commandLink>

我可以在扩展 ExceptionHandlerWrapper 类的 ExceptionHandler 类中捕获这种类型的异常,但我无法保存当前状态,对于这种情况,我能做的最好的事情就是在发生此异常时重定向到主页。

有什么办法可以避免这种情况吗?提前感谢您的回答和评论。

4

4 回答 4

2

如其他答案中所述,如果仍在处理 ajax 请求,或者在实际单击提交 commandLink 或 commandButton 之前触发了 ajax 事件(例如通过输入字段上的更改事件),则会发生这种情况。

因此,无法通过 避免 BusyConversationExceptions onclick="preventEventPropagation(event)";,因为 AJAX 事件不是通过传播触发的。

通过侦听正在运行的 ajax 请求并阻止提交直到挂起的 ajax 事件完成,可以轻松避免该问题。

此博客文章JSF2 AJAX/Submit conversation issue中更详细地解释了该问题和解决方案。

于 2015-03-04T08:46:06.787 回答
0

我找到了这个,

指示容器已拒绝请求,因为并发请求与相同的会话上下文相关联。

容器通过阻止或拒绝并发请求,确保一次最多可以与一个请求关联一个长时间运行的对话。如果容器拒绝一个请求,它必须将该请求与一个新的瞬态对话相关联,并从 JSF 生命周期的恢复视图阶段抛出一个 BusyConversationException 类型的异常。

参考这里

于 2013-04-22T04:29:23.837 回答
-1

我也经常看到这个。我开始认为将一些精力用于序列化对对话的访问是一个好主意:

  1. 当您不需要目标视图的对话实例时,请避免传播对话 ID (cid)。具体来说,不相关的导航链接/按钮应该抑制 cid 参数(还没有考虑过如何做到这一点)
  2. 启动使用活动对话的请求时,请禁用传播对话的其他 UI 元素,因此可能会导致并发访问。PrimeFaces 或(甚至更好的)PrimeFaces Extensions blockUI 组件可以作为半透明覆盖层很好地工作,同时 PrimeFaces p:ajaxStatus 可以显示忙碌状态。
  3. 尽可能晚地开始对话。这将最大限度地减少传播长期对话的情况。

不过,我认为这不是一个完整的解决方案。一旦 cid 出现在位置栏中(当您在对话处于活动状态时对表单进行非 ajax 回发时会发生这种情况),您可能会由于多个选项卡/窗口、书签等

于 2012-12-04T22:55:06.050 回答
-1

我也遇到了同样的问题,当我以前单击 .

我在其中一本书中读过,busyConevrsation 与该事件一起发生了两个动作,所以他们说onclick="preventEventPropagation(event)";在 commandLink 中使用 : 来防止该点击的事件传播。所以我使用了相同的方法,它对我有用。

所以现在没有收到 BusyConversationException :)

于 2015-01-06T09:29:57.463 回答