Spring 异步任务 : update jsf view component

标签 spring jsf asynchronous

我有一个长期作业必须在后台运行,完成后我想更新 jsf View 组件。

我用过 SimpleAsyncTaskExecutor做这项工作。它运行良好,但是当我开始更新 ui 时,我收到了 NullPointerException .

这是我的代码

SimpleAsyncTaskExecutor tasks = new SimpleAsyncTaskExecutor(); 
tasks.submitListenable(new Callable<String>() {

    @Override
    public String call() throws Exception {
        //Do long time taking job in approximately 16 seconds
        doTheBigJob();

        //then update view component by it's id
        FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(myComponentId);
        return "";          
    }       
});

不是:当时间很短(比如 2 秒)时,没有 NullPointerException发生

先谢谢了。

最佳答案

FacesContext.getCurrentInstance()返回 null因为它试图从 thread local variable 获取上下文.但是因为正在执行的线程不是由 JSF 初始化的(由 javax.faces.webapp.FacesServlet 完成)而是由执行器创建的,所以线程局部变量是 null .

我不知道为什么NullPointerException有时不会发生。默认 SimpleAsyncTaskExecutor除非您指定线程池,否则每次都会创建新线程。当我重新创建示例时,它每次都会发生。也许它确实但没有正确记录......

要解决您的问题,您需要求助于投票。例如,您可以使用支持 bean 的属性来指示作业已完成。

@Named("someBean")
@SessionScoped
public class SomeBean {
    private volatile boolean jobDone = false;

    public String execute() {
        SimpleAsyncTaskExecutor tasks = new SimpleAsyncTaskExecutor(); 
        tasks.submitListenable(new Callable<String>() {

            public String call() throws Exception {
                //Do long time taking job in approximately 16 seconds
                doTheBigJob();
                jobDone = true
                return "";          
            }       
        });
        return null;
    }

    public boolean isJobDone() {
        return jobDone;
    }

}

在您的页面上输入组件,该组件在 jobDone==true 时呈现.例如:
<h:outputText id="jobDoneText" rendered="#{someBean.jobDone}" value="Job finished"/>

然后使用轮询和 AJAX 更新当前页面。

在纯 JSF 中,进行轮询的唯一方法是使用 JavaScript 和 JSF AJAX 请求的组合。

或者,您可以使用 Primefaces 组件 p:poll 轮询更改。
<p:poll interval="1" update="jobDoneText" />

可以在以下问题的答案中找到有关 JSF 中轮询的更多信息:JSF, refresh periodically a component with ajax?

关于 Spring 异步任务 : update jsf view component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28784838/

相关文章:

scala - 在异步 Scala Web 应用程序中组织和分析日志

javax.servlet.ServletException : ICEfaces requires the PersistentFacesServlet

javascript - MSCRM async javascript SDK.REST.retrieveMultipleRecords 仅返回 50 条记录,一次需要所有记录

java - 如何在 Spring-Batch 中使用 ItemReader 跳过行?

java - 我如何在java中对这个方法进行单元测试?

java - 查看 mojarra 上的过期问题

java - session 超时的工作方式与我希望的不同

.net - 基于 TcpListener 的应用程序不能很好地扩展

java - JMS 出站 channel 适配器基于 java 的配置

java - Spring,从异常中获取多个模型违规