テクノロジーは日々変化し続けています。場合によっては、サーバー上でジョブを定期的に実行する必要があります。サーバー上でジョブを手動で実行するのは難しい作業であるため、ユーザーまたは管理者が複数回実行することはできません。この問題を解決するには、 クロン プログラマがサーバー上でジョブを定期的に実行するのに役立ちます。自動システムのメンテナンスや賞賛に広く使用されています。これに加えて、次のこともできます。 クロン式 ウェブ開発で。 Web アプリケーションで特定のタスクを定期的に実行する必要がある状況は数多くあります。
このセクションでは、 Java Cron 式 、それは動作し、実装されています Java Quartz スケジューラ 。
クロンとは何ですか?
基本的に、Cron はタスクをスケジュールするユーティリティです。これにより、ユーザーは指定された時間、日付、月、弱い、年に定期的にタスクをスケジュールできます。人間の介入が不要な自動プロセスで広く使用されています。
クロン式
Java では、Cron 式を使用して、 クロントリガー クラス。のサブクラスです org.quartz.トリガー クラス。 Cron 式は、6 つまたは 7 つのフィールド (時間単位) で構成される文字列または式です。スケジュールとコマンドの個別の詳細を説明します。
arp - コマンド
cron 式は単純な場合もあれば、複雑な場合もあります。例えば、
単純: * * * * ? * (アスタリスクはフィールドを示します)
複雑な: 0 0/4 12,15,3-35,52 ? 2002 年から 2010 年の 5 月、6 月、7 月火~土。
また、Cron 式は次のようにさまざまなスタイルで記述できることに注意してください。たとえば、次の 3 つの Cron 式は同じ意味を持ちます。
- 0 10 9 ? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
3 つの式はすべて、毎日午前 9 時 10 分に実行されます。
Cron 式で使用されるフィールド
Cron 式では、時間単位は次のように呼ばれます。 分野 。これらは空白で区切られており、そのフィールドで許可されている文字のさまざまな組み合わせで、許可されている任意の値を含めることができます。フィールドが予想される順序で表示されます。次の表は、時間単位と対応する値、および式で使用できる記号を示しています。
フィールド名 | 必須 | 許可される値 | フィールドで使用できる特殊文字と記号 |
---|---|---|---|
秒 | はい | 0-59 | 、 - * / |
分 | はい | 0-59 | 、 - * / |
時間 | はい | 0-23 | 、 - * / |
月の日 | はい | -31 | 、 - * ? /LWC |
月 | はい | 0~11 または 1 月~12 月 | 、 - * / |
曜日 | はい | 1~7または日曜日~土曜日 | 、 - * ? /LC# |
年 | オプション | 空または 1970 ~ 2099 年 | 、 - * / |
Cron 式で使用される特殊な記号と文字
アスタリスク (*): 記号は時間単位(分、秒、時)ごとにイベントを実行したい場合に使用します。たとえば、* を分の時間単位で使用すると、イベントが 1 分ごとに自動的に実行されることを意味します。
スキャナー.ネクストJava
疑問符 (?): この記号は、日や曜日などのフィールドで使用されます。これは任意の値を示し、フィールドの値は無視されます。毎月 2 日が何曜日であるかを気にせずに、毎月 2 日にスクリプトを実行したいとします。この場合、疑問符記号 ( ?) 曜日フィールドに。
ハイフン (-): 記号は範囲を指定するために使用されます。値の範囲を決定します。たとえば、時間フィールドが次のように定義されている場合、 、 イベントが 4 時間目と 5 時間目に実行されることを意味します。
コンマ (、): これは、カンマで区切られたフィールドの値を定義するために使用されます。たとえば、金、土、日などです。
スラッシュ (/): 指定された時間単位の値をインクリメントするために使用されます。イベントを 10 分に開始し、その後は同じイベントを 20 分に実行し、次の実行は 30 分というように要求されるとします。この場合、開始時刻と増分値をスラッシュで区切って指定します。
たとえば、次の場合 10/10 「分」フィールドに指定されている場合、最初のイベントは 10 分に実行され、次の実行は 1 時間の 20 分になることを意味します。したがって、「いいえ」になります。
L (最後): L の使用は、さまざまな分野で異なる意味を持ちます。
- で使用されていた場合、 フィールドでは、カレンダーに従って月の最終日を示します。
- のようなオフセット値で使用されている場合 L-5 。 5を表します番目暦月の末日まで。
- で使用されていた場合、 フィールドでは、週の最後の日を表します。フィールド内の他の値と一緒に使用することもできます。例えば、 7L を示します この間の土曜日 。
で: 後者は平日 (月曜日から金曜日) を表します。月の指定された日に最も近い平日を決定します。
たとえば、次のように指定すると、 5W 「日」フィールドでは、5 時に近い平日を決定することを意味します。番目今月の。
- 5の場合番目今月のは 土曜日 、イベントがトリガーされます 9番目 今月の。
- 5の場合番目今月のは 日曜日 、イベントがトリガーされます 十一番目 今月の。
別のケースも存在する可能性があります。仮定する 、1セント今月は土曜日なので、3日にイベントが発生しますrd今月の。 これは、前月にはイベントまたはスクリプトが実行されないことを意味します。
ハッシュ (#): これは、月の n 番目の平日を表します。たとえば、毎月第 3 金曜日は次のように指定できます。 6#3 。
なぜ cron 式を使用する必要があるのでしょうか?
cron 式を使用する理由はさまざまです。そのうちのいくつかは次のとおりです。
ミア・ハリファの年齢
- キャッシュされたデータ ファイルを一定の間隔で期限切れにして消去できます。
- 毎日のニュースレターや電子メールをスケジュールできます。
- 長時間実行されるタスクを Web スクリプトから実行するのではなく、コマンド ライン スクリプトから実行するようにスケジュールできます。ビデオのエンコードや大量の電子メールの送信など。
Cron 式の例
特殊なシンボルとフィールドを使用する一般的な Cron 式をいくつか見てみましょう。
クロン式 | Cron 式の意味 |
---|---|
0 12 * * ? | これは、ジョブが毎日午後 12:00 (正午) に実行されることを示します。 |
0/5 13.18 * * ? | これは、ジョブが毎日午後 1 時に開始して午後 1 時 55 分に終了し、その後午後 6 時に開始して午後 6 時 55 分に終了するまで 5 分ごとに実行されることを示します。 |
0-5 13 * * ? | これは、ジョブが毎日午後 1 時から午後 1 時 05 分に終了するまで、毎分実行されることを示します。 |
15,45 13 ? 6日(火) | これは、6 月の毎週火曜日の午後 1 時 15 分と午後 1 時 45 分にジョブが実行されることを示します。 |
30 9? * 月~金 | これは、ジョブが毎週月曜日、火曜日、水曜日、木曜日、金曜日の午前 9 時 30 分に実行されることを示します。 |
30 9 15 * ? | これは、ジョブが毎月 15 日の午前 9 時 30 分に実行されることを示します。 |
0 18L * ? | これは、ジョブが毎月末日の午後 6 時に実行されることを示します。 |
0 18 L-3 * ? | これは、ジョブが毎月 3 日から末日までの午後 6 時に実行されることを示します。 |
30 10 ? ※5L | これは、ジョブが毎月最終木曜日の午前 10 時 30 分に実行されることを示します。 |
0 10 ? *23 | これは、ジョブが毎月第 3 月曜日の午前 10 時に実行されることを示します。 |
0 0 10/5 * ? | これは、毎月 10 日から 5 日間、毎日午前 12 時にジョブが実行されることを示します。 |
0 11 11 11 11 ? | これは、ジョブが毎年 11 月 11 日の午前 11 時 11 分に実行されることを示します。 |
0 15 10 ? * 6L 2002-2005 | 2002 年、2003 年、2004 年、2005 年の毎月最終金曜日の午前 10 時 15 分に発生します。 |
0 0 0 ? * 私の#1 | これは、ジョブが月の最初の月曜日の午前 0 時に実行されることを示します。 |
0 0 0 LW * * | これは、ジョブが月の最終平日の午前 0 時に実行されることを示します。 |
0 0/30 8-10 * * * | これは、ジョブが毎日 8:00、8:30、9:00、9:30、10:00、および 10:30 に実行されることを示します。 |
Cron 式の特別な設定
上記の特殊記号に加えて、Cron 式はいくつかの事前定義された特殊値もサポートしています。これらの値はフィールドの代わりに使用できます。
Java での Cron 式の使用
Java は、特定の時間単位でジョブをスケジュールするオープンソースのジョブ スケジューリング システムを提供します。 Quartz スケジューラは公式サイトからダウンロードできます。
プログラミングの観点から見ると、ジョブは実行されるタスクを含むクラスです。しかし、問題はそれをどのようにスケジュールするかです。ジョブをスケジュールするには、トリガーを定義し、ジョブをいつ実行するかを指定します。
Quartz スケジューラを実装したい場合は、次のように依存関係を追加できます。
org.quartz-scheduler quartz 2.2.1
注: 次の Java プログラムを実行する前に、次のものが追加されていることを確認してください。 クォーツ-2.2.1.jar ファイルをパスに含めないと、エラーが発生します。
Java プログラムによる cron 式とジョブの実装を見てみましょう。
ステップ1: Maven プロジェクトを作成します。という名前で作成しました Cron の例 。
リストするJava配列
ステップ2: プロジェクト内で、2 つのパッケージを作成します。 com.javatpoint.app そして com.javatpoint.job 。最初のパッケージでメイン クラスを定義し、2 番目のパッケージでジョブを定義します (この場合、ジョブの数は 5 です)。
ステップ 3: pom.xml ファイルに、次の依存関係を貼り付けます。プロジェクトに必要な JAR ファイルが自動的にダウンロードされます。 pom ファイルは次のようになります。
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
ステップ 4: 実行する 5 つのジョブ (com.javatpoint.job パッケージ内) を作成します。今回の場合、以下の5つのジョブを定義しました。
Job1.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job1 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job1 --->>> Hello user! Time is ' + new Date()); } }
ジョブ2.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job2 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job2 --->>> Hello user! Time is ' + new Date()); } }
ジョブ3.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job3 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job3 --->>> Hello user! Time is ' + new Date()); } }
ジョブ4.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job4 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job4 --->>> Hello user! Time is ' + new Date()); } }
Job5.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job5 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job5 --->>> Hello user! Time is ' + new Date()); } }
ステップ5: MyApp という名前でメイン クラスを作成します。
MyApp.java
package com.javatpoint.app; import org.quartz.CronExpression; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import com.javatpoint.job.Job1; import com.javatpoint.job.Job2; import com.javatpoint.job.Job3; import com.javatpoint.job.Job4; import com.javatpoint.job.Job5; public class MyApp { public static void main(String args[]) { try { JobDetail job1 = JobBuilder.newJob(Job1.class) .withIdentity('job1', 'group1').build(); Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger1', 'group1') .withSchedule(CronScheduleBuilder.cronSchedule('0/5 * * * * ?')) .build(); Scheduler scheduler1 = new StdSchedulerFactory().getScheduler(); scheduler1.start(); scheduler1.scheduleJob(job1, trigger1); JobDetail job2 = JobBuilder.newJob(Job2.class) .withIdentity('job2', 'group2').build(); Trigger trigger2 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger2', 'group2') .withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression('0/7 * * * * ?'))) .build(); Scheduler scheduler2 = new StdSchedulerFactory().getScheduler(); scheduler2.start(); scheduler2.scheduleJob(job2, trigger2); JobDetail job3 = JobBuilder.newJob(Job3.class) .withIdentity('job3', 'group3').build(); Trigger trigger3 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger3', 'group3') .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(13, 46)) .build(); Scheduler scheduler3 = new StdSchedulerFactory().getScheduler(); scheduler3.start(); scheduler3.scheduleJob(job3, trigger3); JobDetail job4 = JobBuilder.newJob(Job4.class) .withIdentity('job4', 'group4').build(); Trigger trigger4 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger4', 'group4') .withSchedule(CronScheduleBuilder.weeklyOnDayAndHourAndMinute(3, 13, 46)) .build(); Scheduler scheduler4 = new StdSchedulerFactory().getScheduler(); scheduler4.start(); scheduler4.scheduleJob(job4, trigger4); JobDetail job5 = JobBuilder.newJob(Job5.class) .withIdentity('job5', 'group5').build(); Trigger trigger5 = TriggerBuilder .newTrigger().withIdentity('cronTrigger5', 'group5') .withSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(28, 13, 46)) .build(); Scheduler scheduler5 = new StdSchedulerFactory().getScheduler(); scheduler5.start(); scheduler5.scheduleJob(job5, trigger5); Thread.sleep(100000); scheduler1.shutdown(); scheduler2.shutdown(); scheduler3.shutdown(); scheduler4.shutdown(); scheduler5.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
上記の手順をすべて完了すると、プロジェクト ディレクトリは次のようになります。
Javaの同等のインターフェース
ステップ6: 上記の Java プログラムを実行して出力を確認します。
すべてのジョブが特定の時間間隔で実行されていることがわかります。