2

我通常使用带有一些字段的 jsf 页面。用户最终调用托管 bean 的函数

 <h:commandButton value="Go" action="#{myManagedBean.myFunction}"/>

在 myFunction 中,使用飞碟库生成 pdf,并以 pdf 文件作为附件发送电子邮件。

我的问题:PDF生成需要一段时间......所以当用户点击h:command按钮时,数据被发送,页面正在处理很长时间......

如何快速向用户呈现 jsf 视图并在单独的线程中开始处理 PDF(并稍后发送邮件)。

任何帮助将不胜感激!克里斯托夫。

4

1 回答 1

2

这个问题并不真正依赖于 JSF 也不依赖于 spring。既然你已经用 spring 标记了你的问题,请看这里TaskExecutor是用于异步处理的抽象 API。如果您不想要 spring 依赖项,请java.util.concurrent.Executor使用ThreadPoolExecutor.

使用单个ThreadPoolExecutor用于此任务 - 例如弹簧单例 - 您可以通过设置适当的池大小来控制可以并行运行多少个 pdf 生成线程。

executor.execute(new Runnable() {
  public void run() {
    Reader r = generatePDF(someData);
    sendEmail(r, userData);
    r.close(); // in finally preferably
  }
}

如果您想在 pdf 生成完成后更新 JSF GUI,您可以尝试一些推送实现,但如果可能的话我会避免这种情况。

于 2012-05-03T19:02:30.910 回答