web-dev-qa-db-ja.com

毎日設定された時間にJavaメソッドを実行する

私はJavaに比較的慣れておらず、作業するプロジェクトを選択しました。しかし、ブロックに遭遇しました。特定の時間に実行するメソッドが必要です。日。かなりの検索を行いましたが、うまくいくと思われるものが見つかりません。Timerクラスに遭遇しましたが、一定の間隔で実行されているようです。Schedulerクラスは同じ問題があります。Quartzにも出くわしましたが、もっと軽量なものが必要だと思います。間隔を置いて物事を行う方法しかわかりませんでした。

たぶん、私が新しいという理由だけで、これらのクラスで私を助けることができるいくつかのことを逃しました、しかし私は本当に立ち往生していて、いくつかの助けを使うことができました。

毎日、特定の時間に何かを実行するクラス(イベントをキャンセルできることに対するボーナスポイント)を誰かが教えてくれて、クラスを正しく使用する方法を教えてくれるとしたら、それは素晴らしいことです!

TL; DR:プログラムは1日を通して複数回再起動される可能性があるため、間隔ではなく、1日の時間に何かを実行するクラスが必要です。

15
Austin Moore

timerTaskクラスを試してください

詳細については、チェックアウトしてください http://oreilly.com/Java/archive/quartz.html

import Java.util.Calendar;
import Java.util.Date;
import Java.util.Timer;
import Java.util.TimerTask;

public class ReportGenerator extends TimerTask {

  public void run() {
    System.out.println("Generating report");
    //TODO generate report
  }

}

class MainApplication {

  public static void main(String[] args) {
    Timer timer = new Timer();
    Calendar date = Calendar.getInstance();
    date.set(
      Calendar.DAY_OF_WEEK,
      Calendar.SUNDAY
    );
    date.set(Calendar.HOUR, 0);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);
    // Schedule to run every Sunday in midnight
    timer.schedule(
      new ReportGenerator(),
      date.getTime(),
      1000 * 60 * 60 * 24 * 7
    );
  }//Main method ends
}//MainApplication ends
29
dov.amir

可能であれば、OSのスケジューラを使用してスクリプトまたはJavaアプリケーションを呼び出すことをお勧めします。たとえば、* nixの「cron」、または「 Windowsの「タスクスケジューラ」。

4
paulsm4

1つの可能性は、必要な精度に応じて、外部スケジューラを使用することです。 UNIXではCRONを使用し、WindowsではWindowsスケジューラを使用します。これにより、タイミングと実行がうまく分離されます。

タイマーを使用して、必要な粒度に応じて1分ごとまたは5分ごとに時間をチェックする単純なクラスを作成できます。それは非常に軽量でしょう。

2