1. 概要

cron式を使用すると、特定の日時に定期的に実行するタスクをスケジュールできます。 Unixに導入された後、他のUnixベースのオペレーティングシステムとソフトウェアライブラリ(Spring Frameworkを含む)は、タスクスケジューリングにそのアプローチを採用しました。

このクイックチュートリアルでは、UnixベースのオペレーティングシステムとSpringFrameworkのCron式の違いを確認します。

2. UnixCron

ほとんどのUnixベースのシステムのCronには、分(0-59)、時間(0-23)、曜日(1-31)、月(1-12または名前)、および曜日(0〜7または名前)。

アスタリスク(*)のように、各フィールドにいくつかの特別な値を入れることができます。

5 0 * * *

ジョブは毎日深夜5分後に実行されます。 値の範囲を使用することも可能です。

5 0-5 * * *

ここで、スケジューラーは、毎日午前0時から5分後、および1、2、3、4、および5時から5分後にタスクを実行します。

または、値のリストを使用できます。

5 0,3 * * *

これで、スケジューラーは毎日午前0時から5分後、および3時から5分後にジョブを実行します。 オリジナルのCron式は、これまでに説明したものよりも多くの機能を提供します。

ただし、には大きな制限が1つあります。専用の2番目のフィールドがないため、2番目の精度でジョブをスケジュールすることはできません。

Springがこの制限をどのように修正するかを見てみましょう。

3. 春のcron

Springで定期的なバックグラウンドタスクをスケジュールするには、通常、Cron式を@Scheduledアノテーションに渡します。

UnixベースのシステムのCron式とは対照的に、 SpringのCron式には、秒、分、時、日、月、平日の6つのスペースで区切られたフィールドがあります。

たとえば、10秒ごとにタスクを実行するには、次のようにします。

*/10 * * * * *

また、毎日午前8時から午前10時まで20秒ごとにタスクを実行するには:

*/20 * 8-10 * * *

上記の例に示されているように、 最初のフィールドは、式の2番目の部分を表します。 これが2つの実装の違いです。 2番目のフィールドの違いにもかかわらず、Springは、範囲番号やリストなど、元のCronの多くの機能をサポートしています。

実装の観点からは、 CronSequenceGenerator クラスは、SpringでのCron式の解析を担当します。

4. 結論

この短いチュートリアルでは、SpringとほとんどのUnixベースのシステムのCron実装の違いを見ました。 その過程で、両方の実装の例をいくつか見ました。

Cron式の例をもっと見るには、Cron式ガイドを確認することを強くお勧めします。 さらに、 CronSequenceGenerator クラスのソースコードを見ると、Springがこの機能をどのように実装しているかがわかります。