0

次のような特定のタイミングでクライアントにレポートを自動送信する必要があります

  • 毎日00:01AM
  • 毎週日曜日00:01AM
  • 毎月1日目
  • 毎年1日目

毎日私はこれをやっています:

public void contextInitialized(ServletContextEvent arg0) {

        System.out.println("context initiallized");
        System.out.println("Starting timer");

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 1);
        calendar.set(Calendar.SECOND, 0);

        Date alarmTime = calendar.getTime();

        _timer = new Timer();
        _timer.schedule(new AlarmTask(), alarmTime);
    }

これが私が日常のタスクを実行するクラスです:

public class AlarmTask extends TimerTask {

    public void run() {
        // Do your work here; it's 00:01 AM!         
    }
}

正常に動作しているようですが、 午前00:01 以降にいつでもTomcatを開始すると、午前02:30にタスクが実行され、翌日に実行する必要があるコンテキストが読み込まれるとすぐに実行されます...

彼らは私のコードに何か問題がありますか?

4

5 に答える 5

3

QuartzSchedularhttp: //quartz-scheduler.org/を使用してみませんか

于 2013-02-08T21:05:42.677 に答える
2

Calendar過去にスケジュールしたように、完全な日付をモデル化します。Timerすぐに実行することでそれに対応します。の日をインクリメントしCalendarます。

于 2013-02-08T21:04:48.503 に答える
1

クォーツを見たことがありますか?それはあなたがあなたのタスクをスケジュールするのを助けるかもしれません!

于 2013-02-08T21:06:29.357 に答える
0

私はあなたがマルコトポルニクが上で言ったことをしなければならないと思いますhttps://stackoverflow.com/a/14781326/2040095

しかし、それに加えて、このレポートを1日だけでなく毎日送信する必要があるため、Timerクラスのメソッド「schedule」の3つのパラメーター形式を呼び出す必要もありますか?

だから何かのような

_timer.schedule(new AlarmTask(), alarmTime, period );

ここで、期間は日次レポートの場合は24時間になります。

于 2013-02-08T21:30:43.067 に答える
0

巨大なプロジェクトでこれを行う場合は、Quartz Schedularにアクセスすることをお勧めします。これは、ジョブを処理し、ジョブを作成および編集するためのユーザーインターフェイスを備えているためです。定期的に実行する必要があるのが小さなアラームタスクの場合は、バッチファイルを作成し、それをcronジョブに追加して特定の間隔で実行します。

これがお役に立てば幸いです。

于 2013-03-05T14:16:01.063 に答える