0

2つの独立したスタンドアロンJavaポーリングツールを実行するシナリオがあり、5分の固定間隔で特定のタスクを実行します。

私のシナリオは(ポーリングサービスごとに):

1)タスクT0の実行に5分以上かかる場合、その間にT5が来て実行しようとすると、待機または再起動せずに、タスクT0を破棄します(重複するタスクを破棄します)

2)次のタスクは通常T10から始まります。

私の質問は、クォーツを使用するのはやり過ぎになるということです。TaskExecutorServiceを使用している場合、時間Xでタスクが開始されたら、時間X-5がすでに実行されていることを確認するにはどうすればよいですか?それを破棄する必要があります。

注:1)JDK<=6.0を使用する必要があります

2)私は春のようなフレームワークの下で使用していません。

3)デスクトップツールなので、起動する必要があり、実行されます。

コードスニペットや方向性は大歓迎です。

以下のコメントの回答を更新しました:

はい、単一のツールで実行されているタスク間です。ツールは異なり、ツール間には接続がなく、別々に実行され、関係はありません。

1つのツールが5分間隔で同じタスクを実行します(ファイルの1分ごとに、ディレクトリ内でファイルを検索し、見つかった場合はそれらのファイルを解析して処理します)。

たとえば、タスクが現在実行されているときに最初の1分から開始された場合(時間がかかる場合があります)、5分後にツールはそのタスクを再度起動して新しいファイルを探しますが、今回は解析/処理されません前のタスクがすでにいくつかのファイルの処理を実行しているため、新しいタスクは実行されず、システムはそれをダンプします(キューなし/待機なし/シーケンシャルジョブなし)。

別の新しいタスクが再び5倍の時間で実行され、他に実行されていない場合は、それらのファイルを解析して処理します。

4

2 に答える 2

1

コメント内の質問に対する回答を確認した後、Excecutorsを使用してScheduledExecutorServiceを取得できます。次に、メソッドscheduleWithFixedDelayを使用してタスクを送信できます。このメソッドは、実行の間に遅延を置いてタスクを再実行します。あなたの場合の良い点は、現在の実行が終了した後に遅延カウントが開始されることです。これにより、2つのタスクを同時に実行することがないため、ブール変数やReentrantLockを使用せずに必要なものが得られます。例外が発生するとタスクの後続の実行がキャンセルされるため、例外をキャッチするように注意する必要があります。

それで、runnableを実装するクラスMyTaskがあると仮定しましょう

public class MyTask implements Runnable{

  public void run() {
     try {
           //your task code here
     } catch (...) {
        //deal with the exceptions here               
     }
  }

}

mainメソッドから実行すると仮定すると、クラスを使用して繰り返し発生するタスクをスケジュールできます。

public class TaskRunner{

private static final ScheduledExecutorService taskScheduler = Executors.newScheduledThreadPool(1);

  public static void main(String[] args) {
    taskScheduler.scheduleWithFixedDelay(new MyTask(),0,5,TimeUnit.MINUTES);  
  }

}
于 2012-11-18T20:10:50.243 に答える
0

解決策は簡単です。ScheduledThreadPoolExecutor.scheduleAtFixedRate(task、5、min)を使用します。共通のブール変数を宣言しますisRunning=false。各タスクは開始時にこの変数をチェックし、すでに設定されている場合は終了し、そうでない場合はtrueに設定して実行します。最後に、falseに設定します。チェックと設定は同期ブロックで行う必要があります。

于 2012-11-17T14:17:58.320 に答える