0

我面临的问题已经困扰了一周,这里是:我有一个类 AdminBlocageBackgroundProcessing.java,它通过读取数据并验证它并将其存储在数组列表中来处理 CSV 文件:

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;

}

我从我的动作类中调用它:

ServletContext servletContext=getServlet().getServletContext();
ExecutorService execService = (ExecutorService)servletContext.getAttribute("threadPoolAlias");
AdminBlocageBackgroundProcessing adminBlocageBackgroundProcessing= new AdminBlocageBackgroundProcessing(fichier,blocage);
if(status==0 && refreshParam.equals("eventParameter"))
        {
                future= execService.submit(adminBlocageBackgroundProcessing);
                status=1;
                autoRefControl=1;
                req.setAttribute("CHARGEMENT_EN_COURS","chargement");
                return mapping.findForward("self");
        }



        if(status==1)
        {
        // for checking if the submitted future task is completed or not    
        isFutureDone=future.isDone();

        if(isFutureDone)
        {
            data=future.get();
            status=0;
            System.out.println("Process is Completed");
            req.setAttribute("TRAITEMENT_TERMINE","termine");
            //sessiondata.putBean(Constantes.BEAN_CONTRATCLIENT_CONTRAT_CLE_FIA, null);
            //formulaire.set("refreshParam","" );
            execService.shutdown();
            isFutureDone=false;

        }
        else{
            System.out.println("Les données sont encore en cours de traitement");
            req.setAttribute("CHARGEMENT_EN_ENCORE","encore");
            return mapping.findForward("self");
            }
        }

现在的问题是 CSV 有太多数据,当我们点击导入它时,进程在后台异步启动,但它永远不会完成,尽管在 jsp 中使用了自动刷新来维护会话。尽管代码对小数据工作正常,但我们如何确保它完成?
但是对于大数据,此功能会崩溃并且无法监控。

我正在使用的线程池由容器提供:

public class ThreadPoolServlet implements ServletContextListener
 {

    public void contextDestroyed(ServletContextEvent arg0) {
    final ExecutorService execService = (ExecutorService) arg0.getServletContext().getAttribute("threadPoolAlias");
    execService.shutdown();
    System.out.println("ServletContextListener destroyed");
    // TODO Auto-generated method stub

}
    //for initializing the thread pool
    public void contextInitialized(ServletContextEvent arg0) {
    // TODO Auto-generated method stub
      final ExecutorService execService = Executors.newFixedThreadPool(25);
      final ServletContext servletContext = arg0.getServletContext();
      servletContext.setAttribute("threadPoolAlias", execService);
      System.out.println("ServletContextListener started");         
}

}

4

1 回答 1

0

快速浏览了一下.. your isFutureDonedepends on status,它在提交任务后立即执行 - 这相当快。 status只更新一次,不再更新。这在非常短的、看似即时的任务的情况下很好,尽管它会因大型任务而中断。它会中断,因为您future.get有条件地使用基于 的方法isFutureDone,对于较长的任务,这将是错误的。所以你永远不会get有结果,即使你的任务在执行者中完成。取消isFutureDone. 读一点[Future.get][1](两个版本 [有和没有超时] 块,这是您在这里需要的 - 等待任务完成)。在调用 CSV 服务的代码中使用超时是一个好主意,以便在超时时间过长时允许失败。

于 2013-09-11T17:46:53.490 回答