如何监视未来任务完成的后台任务

时间:2013-09-03 06:48:43

标签: java struts executorservice future threadpoolexecutor

大家好我正在使用Struts1.1,点击JSP中的按钮,我们需要处理大量数据,这涉及数据库验证,数百万条记录需要2个多小时。 所以我们想用执行服务和Java asynchronously.So用户可以自由移动到其他页面的未来任务在后台执行,而后台处理完成,当完成这一过程用户可以回来到同一个JSP点击另一个按钮(处理完成后激活)查看数据处理结果: 这是我的动作类:

ServletContext servletContext=getServlet().getServletContext();
        ExecutorService poolService = (ExecutorService) servletContext.getAttribute("threadPoolAlias");
        AdminBlocageBackgroundProcessing adminBlocageBackgroundProcessing= new AdminBlocageBackgroundProcessing(fichier,blocage);
        Future<ArrayList> future= poolService.submit(adminBlocageBackgroundProcessing);

这是我完成数据库验证的模型类:

public class AdminBlocageBackgroundProcessing implements Callable {
private FormFile fichier;
private String blocage;
public ArrayList data=null;
public AdminBlocageBackgroundProcessing(FormFile fichier, String data) {
this.fichier=fichier;
this.blocage=data;
    // TODO Auto-generated constructor stub
}

public Object call( ) {
    // TODO Auto-generated method stub
    try{
    data = ImportMetier.extractFromCSV(
        new String(fichier.getFileData(), 
                   "ISO-8859-1"),blocage);

    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return data;
}

现在我的问题是我如何能够在应用程序级别上监视此“调用”方法的执行情况,以便在完成后可以显示数据处理结果。

最重要的是我想在后台中执行它,以便用户可以在应用程序的其他部分自由移动,因此我无法使用

data=future.get();

因为它会导致主线程等到调用方法没有完成。

提前致谢: - )

1 个答案:

答案 0 :(得分:0)

为什么不能通过Future#get()传递超时或使用Future#isDone()检查任务是否已完成?