2017-08-02 7 views
0

実行メソッドがデータベースから特定のサブミットジョブを取り出して実行するスレッドクラスを作成しました。セッションリスナーのコンテキスト初期化メソッドでこのスレッドを開始しました。私のサーバーが再起動するとすぐにスレッドが開始されます。 runメソッドでは、最初にデータベース内の「送信済み」状態にあるすべてのタスクを取得し、それを1つずつ実行します。 すべてのタスクが完了した後に新しいタスクを送信すると問題が発生します。スレッドの状態をチェックして、 "RUNNABLE"です。私がサーバーを再起動すると、スレッドはこのタスクを実行していますが、それ以外の場合は賢明です。タスクを実行するためのスレッドの実行を維持する

public void contextInitialized(ServletContextEvent sce) { 
    try { 

     Configuration configuration = new Configuration(); 
     configuration.configure("hibernate.cfg.xml"); 
     ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). 
     applySettings(configuration.getProperties()).buildServiceRegistry(); 
     sessionFactory = new AnnotationConfiguration(). 
     buildSessionFactory(serviceRegistry); 
     logger.debug("sessionFactory created in HibernateSessionFactoryListener.contextInitialized() : " + sessionFactory); 
     // get servletcontext 
     context = sce.getServletContext(); 
     // start session factory 
     context.setAttribute("datasource", sessionFactory); 
     isSessionActive = true; 

     //SubmitTaskThread t = new SubmitTaskThread(); 

     t.start(); 

} 

は、上記のコンテキストでコードが実行方法に

コードを初期化されます。

 public void run(){ 
    //logger1.debug("in run method of thread class"); 

     //SubmitTask st = new SubmitTask(); 
     //st.runJobs(); 
     //TASKS THAT ARE SUBMITTED 
    try { 
     pendingList=getPendingList(); 
    } catch (Exception e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

     if (pendingList.size()>0){ 




     boolean isObjStorage=false; 
     CornicheVO runVO; 
     Transfer newTransferJob; 
     List<String> locations; 
     JobVO jobSubmitVo; 

      for (int listSize=0;listSize<pendingList.size();listSize++){ 
       locations = new ArrayList<String>(); 
       runVO=pendingList.get(listSize); 
       newTransferJob=new Transfer(); 
       jobSubmitVo=new JobVO(); 
       newTransferJob.setTask_id(runVO.getTask_Id()); 
       locations.add(runVO.getSrcLocDesc()); 
       locations.add(runVO.getDstLocDesc()); 
       try { 
        drivesInfo = getLocationInfo(locations); 
       } catch (CornicheException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       try { 

        for (NasDrive drive : drivesInfo) { 
         if (drive.getSrc_loc_desc().equals(
           runVO.getSrcLocDesc())) { 
           if ("OBJSTORAGE".equals(drive.getType())) { 
            isObjStorage = true; 
           newTransferJob.setSrc_server_type("OOSS"); 
          } else { 
           newTransferJob.setSrc_server_type("NAS"); 
          } 
          newTransferJob.setSrc_server(drive.getSrc_server()); 
          newTransferJob.setSrc_server_dflt_loc(drive.getSrc_Loc()); 
          newTransferJob.setSrc_server_id(drive.getUsr_id()); 
          newTransferJob.setSrc_server_pswd(drive.getPswd()); 

         } else { 
          if ("OBJSTORAGE".equals(drive.getType())) { 
           newTransferJob.setDst_server_type("OOSS"); 
          } else { 
           newTransferJob.setDst_server_type("NAS"); 
          } 
          newTransferJob.setDst_server(drive.getSrc_server()); 
          newTransferJob.setDst_server_dflt_loc(drive.getSrc_Loc()); 
          newTransferJob.setDst_server_id(drive.getUsr_id()); 
          newTransferJob.setDst_server_pswd(drive.getPswd()); 
         } 
        } 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 

        e.printStackTrace(); 
       } 

       jobSubmitVo.setClientName(runVO.getClientName()); 
       jobSubmitVo.setSrcServer(runVO.getSrcLoc()); 
       jobSubmitVo.setDstServer(runVO.getDstLoc()); 
       jobSubmitVo.setSrcServerDesc(runVO.getSrcLocDesc()); 
       jobSubmitVo.setDstServerDesc(runVO.getDstLocDesc()); 
       jobSubmitVo.setFileName(runVO.getFileName()); 
       jobSubmitVo.setSizeOfFile("32"); 
       jobSubmitVo.setUsrName(runVO.getLstUpdtIdCd()); 
       jobSubmitVo.setMetaTag(runVO.getMetaTag()); 
       jobSubmitVo.setRententionPeriod(runVO.getRetentionPrdcurrent()); 
       jobSubmitVo.setTask_Id(runVO.getTask_Id()); 

       if (!isObjStorage) { 

         //CURLProcessor uploader = new CURLProcessor(); 
         // Export the scripts first 

         util.exportFiles(newTransferJob.getSrc_server(), newTransferJob.getSrc_server_id(),newTransferJob.getSrc_server_pswd(),newTransferJob.getSrc_server_dflt_loc()); 
         uploadtrasnfer(newTransferJob, runVO.getFileName(), jobSubmitVo); 
        } else { 





         util.exportFiles(newTransferJob.getDst_server(), newTransferJob.getDst_server_id(),newTransferJob.getDst_server_pswd(),newTransferJob.getDst_server_dflt_loc()); 
         downloadTrasnfer(newTransferJob, runVO.getFileName(), jobSubmitVo); 
        } 

        try { 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 

        e.printStackTrace(); 
       } 
      } 

      } 
+1

私はここに関連コードを投稿する必要があると思います。それがなければ何が間違っているのかを理解することは難しい。 – Serge

+0

問題が何であるかを知るのは難しい – BaneDad

+0

本当に答えが必要な場合は、[mcve]を構築する必要があります。時間がかかることがあります。コードを実行して問題を見るためにデータベースを必要としないようにコードを書き直してください。しかし、私はあなたがその努力をしないと良い答えを得るのを見ることができません。 – RealSkeptic

答えて

0

あなたのrun()メソッドは、一度保留中のアイテムのリストを取得し、それらを処理しようとします。ただし、一度処理されると、保留中のアイテムを取得するために戻ってこないように見えます。あなたは、リストを取得し、ループ内の項目を処理する必要があります。

その他の問題もあります。

0

アプリケーションがアプリケーションサーバー内で実行されている場合は、送信タスクをDBから選択してスケジュールされたタスクとして実行するコードが必要です。 x分/時間ごとに実行するようにし、コードが起動するたびに、完了した時点でDBからすべての送信タスクを読み取ります。それを行う最善の方法は、たとえばquartzのような外部スケジューラを使用することです。このようなスケジューラーは定期的にタスクを実行することができ、アプリケーションがサーバーのクラスター内で実行されている場合にも処理できます。私。 Quartzは、あなたがスケジュールしたのと同じくらい多くのサーバをクラスタ化しても、そのうちの1つだけでタスクが実行されることを保証します。これがあなたにはあまりにも大きければ、あなたは自分のスレッドを書く必要はありません。これは古い方法です。 JavaクラスExecutorServiceを見て、すべての異なる実装について読んでください。特に、ScheduledThreadPoolExecutorおよびScheduledExecutorServiceを参照のこと。それらは、はるかに少ないコードで必要なものを行う必要があります

関連する問題