0

私が直面している問題は、今から 1 週間悩まされています。ここにあります。CSV ファイルからデータを読み取って検証し、次のように配列リストに格納することで、CSV ファイルを処理するクラス AdminBlocageBackgroundProcessing.java があります。

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

ざっと見てみると..isFutureDone依存関係は、タスクの送信status直後に実行されます - これはかなり速いです。 一度だけ更新され、再度更新されることはありません。これは、非常に短い、一見瞬時のタスクの場合には問題ありませんが、大きなタスクでは機能しなくなります。に基づいて条件付きでメソッドを使用するため、これは壊れます。これは、より長いタスクの場合は false になります。したがって、エグゼキュータでタスクが完了したとしても、結果は得られません。を廃止します。で少し読んでくださいstatusfuture.getisFutureDonegetisFutureDone[Future.get][1]([タイムアウトありとなしの両方のバージョンがブロックされます。ここで必要なのは、タスクが完了するのを待つためです)。CSV サービスを呼び出すコードでタイムアウトを利用して、不適切に時間がかかる場合の失敗を許容することをお勧めします。

于 2013-09-11T17:46:53.490 に答える