gpt4 book ai didi

CDI 对话 Bean - BusyConversationException

转载 作者:行者123 更新时间:2023-12-03 17:42:48 27 4
gpt4 key购买 nike

我有一个 session 范围的 bean,ComponenteM,它被注入(inject)到请求范围的 bean,ComponenteC 中。

@Named
@RequestScoped
public class ComponenteC implements Serializable {
@Inject
ComponenteM componenteM;
}

ComponenteC 有一个由 HtmlCommandLink(以编程方式创建)调用的导出方法。导出方法调用与 SAP BO Web 服务集成的 Web 服务,以便将报告导出到 Excel。但是,只有当通话时间过长时,我才会收到 BusyConversationException。每隔不到 10 分钟的其他导出都是成功的。
同时,我在对话中没有其他调用(AJAX 或非 AJAX 调用)。
我尝试在开始对话时为对话 bean 设置显式超时,但我读到它仅作为对 CDI 容器的建议,它可能会被忽略:
public void beginConversation() {
if (conversation.isTransient()) {
conversation.setTimeout(60 * 60 * 1000);
conversation.begin();
}
}

错误是:
ServletException.org.jboss.weld.context.BusyConversationException 的根本原因:WELD-000322 对话锁定超时:1

我还尝试通过线程发出导出请求,然后将导出的文档返回到对话中。我的想法是让一个线程忙于处理文档和 componenteC 的导出,在等待线程完成时,偶尔会检查 componenteM.beginConversation();

我试图理解为什么即使没有并发请求也会抛出 BusyConversationException。
谢谢你。

最佳答案

我最近在应用程序中遇到了同样的问题。元素的异步加载工作正常,除了带有@ConversationScoped 的一页。

我的解决方案是简单地使这一页的请求同步。
在此页面上,元素使用 PrimeFaces “deferred”参数异步加载,如下所示:

<p:outputPanel id="asyncMenu" deferred="true">...</p:outputPanel>

当我将参数设置为“false”时,一切都按预期工作。 @ConversationScoped 引入了一个 URL 参数“cid”,所以我只是在具有 cid 的站点上将 deferred 设置为“false”:
<p:outputPanel id="asyncMenu" deferred="#{empty param.cid ? true : false}">...</p:outputPanel>

虽然感觉有点 hacky,但在我的情况下它工作得非常好,如果我们决定添加一个依赖于 @ConversationScoped 的新页面,它也将在 future 工作。

关于CDI 对话 Bean - BusyConversationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31939533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com