0

2分ごとにdbを呼び出して新しいタスクをチェックするプログラムを開発しました

public static void main(String[] args) {
ScheduledExecutorService scheduler =     Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleWithFixedDelay(new ESMSCampaignTask(), 0, 2, TimeUnit.MINUTES);
}

DBからのコードチェックに続いてスレッドを実行

public void run() {

    ExecutorService execService = Executors.newFixedThreadPool(5);

    List<ScheduledCampaigns> scheduledCampaignsList =   campaignsService.getScheduledCampaigns();

    for (ScheduledCampaigns campaign : scheduledCampaignsList) {

        String cmpName = "SCH_CAMPAIGNS_" + campaign.getCampaign_id();

        execService.execute(new Runnable() {
            public void run() {
                smppService.submitShortMessage(campaign);
            }
        });

    }//EO For Loop

}//EO Run

私が探している解決策は、上記のスレッドの完了ステータスを取得して、それに応じて DB を更新する方法です。

execService.awaitTermination(500, TimeUnit.SECONDS); を試してみました。

しかし、既存のスレッドがタスクを完了するまで、新しいスレッドを開始することはできません。

したがって、ソリューションは、既存のスレッドの完了を待たずに2分ごとに新しいスレッドを開始できる機能を提供する必要があり、その間、スレッドの完了ステータスを取得し続けるため、それに応じてデータベースを更新します。

よろしく、

4

1 に答える 1

1

ExcecutorService.submit()ではなくを使用するとexecute、オブジェクトを取得できFutureます。これをベクターに格納すると、このベクター内の項目をループして完了状態を確認できます。;

/**  keep track of currently running tasks */
Vector runningTasks<Future> = new Vector<Future>();

public void run(){
  for (ScheduledCampaigns campaign : scheduledCampaignsList) {

    String cmpName = "SCH_CAMPAIGNS_" + campaign.getCampaign_id();

    Future f = execService.submit(new Runnable() {
        public void run() {
            smppService.submitShortMessage(campaign);
        }
    });
    runningTasks.add(f);

  }//EO For Loop

  // which tasks have just completed?
  Vector<Future> justCompletedTasks = new Vector<Future>();

  // check currently executing tasks
  for (Future task : runningTasks){
   if( task.isDone() || tasks.isCancelled() ){
      justCompletedTasks.add(task);
   }
  } // EO check executing tasks

  // remove completed tasks from current list
  runningTasks.removeAll(justCompletedTasks);
} // EO run

申し訳ありませんが、これはテストされていませんが、アイデアが役立つことを願っていますか?

于 2012-06-27T14:34:21.673 に答える