【问题标题】:CDI Conversation Bean - BusyConversationExceptionCDI 对话 Bean - BusyConversationException
【发布时间】:2015-11-03 13:07:06
【问题描述】:

我有一个会话范围的 bean,ComponenteM,它被注入到请求范围的 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。
谢谢。

【问题讨论】:

  • 为什么不使用执行异步请求的服务?如果您在 ejb-container 中,您可以将会话范围 bean 转换为无状态 bean 并将方法注释为异步,如果没有,您仍然可以使用 ExecutorService 来触发异步请求,这样您的组件就不必等待结果
  • 我没有使用 ExecutorService 但我正在创建一个线程池。我需要我的组件等待结果,因为我需要知道线程何时完成将导出的报告写入文件夹,以便我可以将其检索到组件。
  • 在 java webcontext 中创建你自己的线程池 - 你最好检查一下执行器服务是如何工作的,并使用返回未来的那个
  • executor 服务有什么更好的地方吗?上下文在线程中仍然不活跃,对话仍然必须等待线程结束,以便返回导出的文档。我不介意让对话等待线程,只要在导出过程花费太长时间时不引发错误 BusyConversationException。起初我根本没有线程,我创建了线程以避免对话空闲太久(这就是为什么对话在等待线程时正在验证自己的状态)。
  • 应该发布完整的堆栈跟踪和访问日志。

标签: cdi weld conversation-scope


【解决方案1】:

我最近在应用程序中遇到了同样的问题。元素的异步加载工作正常,除了带有@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>

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

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 2012-01-20
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2015-04-20
    • 2012-03-23
    相关资源
    最近更新 更多