ScheduleDexecutorservice.scheduleatfixedrateおよびこれまでの初期デレイの設定

StackOverflow https://stackoverflow.com/questions/3196888

  •  02-10-2019
  •  | 
  •  

質問

私はJavaのスケジューリングシステムに取り組んでおり、それに基づいてリマインダーを送信します 開始日, 終了日発生 (1時間ごと、毎日、毎週、毎月、月曜日など)。もともと私は使用していました タイマーTimertask リマインダーをスケジュールするクラス:

Timer timer = new Timer();
timer.scheduleAtFixedRate(reminder, firstDate, period);

私は最近切り替えました ScheduleDexecutorService そのため、イベントのキャンセルをさらに制御できました。 ScheduleDexecutorService リマインダーを再スケジュールする1つのケースを除いて、繰り返しリマインダーに適しています。 開始日 過去に。 scheduleatfixedrate 関数は、指定することのみを可能にします 長さ の価値 InitialDelay, 、実際のものではありません 日にち 物体:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(reminder, initialDelay, period, unit);

これは、否定的に渡されてから問題を引き起こします InitialDelay それでもイベントがすぐに解雇されるため、 + 限目, 、 それよりも 開始日 + 限目.

私がどのようにできるかのアイデアは、リマインダーをスケジュールする 開始日 過去に?

役に立ちましたか?

解決

日付が過去にあるかどうかを確認するために簡単なチェックを行ってから、過去のスタートの増加である新しい一時開始データタイムを作成します。

他のヒント

私はそれをスタートアップで一度実行してそれを解決しました、そして、私は毎日欲しかった時に:

// check once initial on startup
doSomething();

// and then once every day at midnight utc
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
LocalDateTime firstRun = LocalDate.now(ZoneOffset.UTC).atStartOfDay().plusDays(1);
Duration durationUntilStart = Duration.between(LocalDateTime.now(ZoneOffset.UTC), firstRun);
scheduler.scheduleAtFixedRate(
        () -> doSomething(),
        durationUntilStart.getSeconds() + 1,
        Duration.ofDays(1).getSeconds(),
        TimeUnit.SECONDS
);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top