春の@Scheduledアノテーション
1. 概要
この記事では、the Spring @Scheduled annotationについて説明します。これを使用して、タスクを構成およびスケジュールする方法を説明します。
メソッドに@Scheduledアノテーションを付けるために従う必要のある簡単なルールは次のとおりです。
-
メソッドにはvoidの戻り値型が必要です
-
メソッドはパラメータを受け入れない
参考文献:
Springで@Asyncを実行する方法
Springで@Asyncを有効にして使用する方法-非常に単純な構成と基本的な使用法から、より複雑なエグゼキューターと例外処理戦略まで。
2. スケジューリングのサポートを有効にする
Springでスケジューリングタスクと@Scheduledアノテーションのサポートを有効にするには、Javaのenableスタイルのアノテーションを使用できます。
@Configuration
@EnableScheduling
public class SpringConfig {
...
}
または、XMLでも同じことができます。
3. 固定遅延でタスクをスケジュールする
一定の遅延後に実行するようにタスクを構成することから始めましょう。
@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
この場合、最後の実行の終了から次の実行の開始までの期間は固定されます。 タスクは、前のタスクが完了するまで常に待機します。
このオプションは、前の実行を完了してから再実行することが必須である場合に使用する必要があります。
4. 固定レートでタスクをスケジュールする
一定の時間間隔でタスクを実行してみましょう。
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
このオプションは、タスクの各実行が独立している場合に使用する必要があります。
デフォルトでは、スケジュールされたタスクは並行して実行されないことに注意してください。 したがって、fixedRateを使用した場合でも、前のタスクが完了するまで次のタスクは呼び出されません。
スケジュールされたタスクで並列動作をサポートする場合は、@Asyncアノテーションを追加する必要があります。
@EnableAsync
public class ScheduledFixedRateExample {
@Async
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTaskAsync() throws InterruptedException {
System.out.println(
"Fixed rate task async - " + System.currentTimeMillis() / 1000);
Thread.sleep(2000);
}
}
これで、前のタスクが実行されていなくても、この非同期タスクが毎秒呼び出されます。
5. 固定レートと固定遅延
Springの@Scheduledアノテーションを使用してスケジュールされたタスクを実行できますが、プロパティfixedDelayとfixedRateに基づいて実行の性質が変化します。
fixedDelayプロパティは、タスクの実行の終了時間とタスクの次の実行の開始時間の間にnミリ秒の遅延があることを確認します。
このプロパティは、タスクのインスタンスが常に1つだけ実行されるようにする必要がある場合に特に役立ちます。 依存ジョブの場合、非常に役立ちます。
The fixedRate property runs the scheduled task at every n millisecond.タスクの以前の実行はチェックされません。
これは、タスクのすべての実行が独立している場合に便利です。 メモリとスレッドプールのサイズを超えることが予想されない場合は、fixedRateが非常に便利です。
ただし、受信タスクがすぐに終了しない場合は、「メモリ不足の例外」が発生する可能性があります。
6. 初期遅延のあるタスクをスケジュールする
次へ–遅延(ミリ秒単位)でタスクをスケジュールしましょう:
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"Fixed rate task with one second initial delay - " + now);
}
この例では、fixedDelayとinitialDelayの両方をどのように使用しているかに注意してください。 タスクはinitialDelay値の後に最初に実行され、fixedDelayに従って実行され続けます。
このオプションは、タスクに完了する必要があるセットアップがある場合に便利です。
7. cron式を使用してタスクをスケジュールする
遅延とレートが十分でない場合があり、タスクのスケジュールを制御するためにcron表現の柔軟性が必要です。
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
注–この例では、毎月15日の午前10時15分に実行されるタスクをスケジュールしていることに注意してください。
8. スケジュールのパラメータ化
これらのスケジュールをハードコーディングするのは簡単ですが、通常は、アプリ全体を再コンパイルおよび再デプロイせずにスケジュールを制御できる必要があります。
Spring Expressionsを使用してタスクの構成を外部化し、これらをプロパティファイルに保存します。
fixedDelayタスク:
@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")
fixedRateタスク:
@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
cron式ベースのタスク:
@Scheduled(cron = "${cron.expression}")
9. XMLを使用したスケジュールされたタスクの構成
Springは、スケジュールされたタスクを構成するXMLの方法も提供します。これらを設定するXML構成は次のとおりです。
10. 結論
この記事では、configure and use the @Scheduled annotationへの道を理解しました。
スケジューリングを可能にするプロセスと、スケジューリングタスクパターンを構成するさまざまな方法について説明しました。
示されている例は、over on GitHubにあります。