Rit*_*ita 6 cdi conversation-scope weld
我有一个会话范围的 bean ComponenteM,它被注入到请求范围的 bean ComponenteC 中。
@Named
@RequestScoped
public class ComponenteC implements Serializable {
@Inject
ComponenteM componenteM;
}
Run Code Online (Sandbox Code Playgroud)
ComponenteC 有一个由 HtmlCommandLink(以编程方式创建)调用的导出方法。导出方法调用与 SAP BO 网络服务集成的网络服务,以便将报表导出到 excel。但是,只有当调用时间过长时,我才会收到 BusyConversationException。任何其他少于 10 分钟的导出都是成功的。
同时我在对话中没有其他电话(AJAX 或非 AJAX 调用)。我已经尝试在开始对话时为对话 bean 设置显式超时,但我读到它仅用作对 CDI 容器的建议,并且可能会被忽略:
public void beginConversation() {
if (conversation.isTransient()) {
conversation.setTimeout(60 * 60 * 1000);
conversation.begin();
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
ServletException.org.jboss.weld.context.BusyConversationException 的根本原因:WELD-000322 对话锁定超时:1
我还尝试通过线程发出导出请求,然后将导出的文档返回到对话中。我的想法是让一个线程忙于处理文档和 componenteC 的导出,在等待线程完成时,偶尔会检查执行 componenteM.beginConversation();
我试图理解为什么即使没有并发请求也会抛出 BusyConversationException。
谢谢你。
小智 0
我最近在应用程序中遇到了同样的问题。除了带有 @ConversationScoped 的一页之外,元素的异步加载工作正常。
我的解决方案是简单地使这一页面的请求同步。在此页面上,元素使用 PrimeFaces“deferred”参数异步加载,如下所示:
<p:outputPanel id="asyncMenu" deferred="true">...</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)
当我将参数设置为“false”时,一切都按预期进行。@ConversationScoped 引入了一个 URL 参数“cid”,因此仅当在具有 cid 的站点上时,我只需将 deferred 设置为“false”:
<p:outputPanel id="asyncMenu" deferred="#{empty param.cid ? true : false}">...</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)
虽然感觉有点 hacky,但在我的情况下它工作得很好,并且如果我们决定依赖 @ConversationScoped 添加一个新页面,它也将在将来工作。
| 归档时间: |
|
| 查看次数: |
3218 次 |
| 最近记录: |