Spring + SpringMVC環境では、通常、通常のタスクを実行するために2つのオプションがあります。1つはSpring独自のプロセッサタイミングタスク@Scheduled
ノートを使用する方法、もう1つはサードパーティのフレームワークQuartz、SpringBootを使用する方法です。Spring + SpringMVCなので、当然、これら2つのSpringでタイミングタスクの実装戦略があり、もちろんQuartzもサポートしています。この記事では、SpringBootでの2つのタイミングタスクの実装について説明します。
記事ディレクトリ
1.最初の方法:@Scheduled
使用して@Scheduled
直接春ブートプロジェクトを作成し、ウェブを追加するために非常に簡単に成功したプロジェクトを作成するには、春・ブート・スターター・ウェブに頼って、追加@EnableScheduling
の注釈を、スケジュールされたタスクを有効にします。
@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
次に、タイミングタスクを構成します。
@Service
public class HelloService {
//前面任务的结束时间和后面任务的开始时间之间间隔2s
@Scheduled(fixedDelay = 2000)
public void fixedDelay() {
System.out.println("fixedDelay>>"+new Date());
}
//两次定时任务开始的间隔时间为2s
@Scheduled(fixedRate = 2000)
public void fixedRate() {
System.out.println("fixedRate>>"+new Date());
}
@Scheduled(initialDelay = 2000,fixedDelay = 2000)
public void initialDelay() {
System.out.println("initialDelay>>>"+new Date());
}
}
(1)
@Scheduled
時限タスクを開くためにアノテーションを最初に使用した。
(2)fixedDelay
タスク実行間の時間間隔、具体的にはこのタスクの終了から次のタスクの開始までの時間間隔を表します。
(3)fixedRate
タスク実行間の時間間隔、具体的には2つのタスクの開始間の時間間隔を表します。つまり、2番目のタスクが開始したときに、最初のタスクが終了していない可能性があります。
(4)initialDelay
最初のタスク開始の遅延時間を示します。
(5)すべての時間の単位はミリ秒です。
これは基本的な使用法です。これらの基本的なプロパティに加えて、@Scheduled
注釈はcron
式もサポートします。式の使用cron
は、タスク時間のタイミングの非常に豊富な説明になります。cron式の形式は次のとおりです。
[秒] [分] [時間] [日] [月] [週] [年]
注意する必要があるのは、曜日と曜日が競合する可能性があるため、2つのうちの1つは ?
ワイルドカードの意味:
(1)
?
値が指定されていない、つまり、特定のフィールドの値が関係しない場合に使用されることを意味します。曜日と週が競合する可能性があるため、構成するときは、2つのうちの1つを指定する必要があることに注意してください。
(2)*
すべての値を意味します。たとえば、2番目のフィールドに設定します*
。これは、毎秒がトリガーされることを意味します。
(3),
複数の値を区切るために使用されます。たとえば、週フィールドに「MON、WED、FRI」を設定して月曜日、水曜日、金曜日のトリガーを示します。
(4)-
間隔を表します。たとえば、秒に「10-12」を設定して10を示します。 、11,12秒は、増分トリガーの場合
(5)/
をトリガーします。たとえば、2番目に「5/15」を設定すると、5秒から開始し、15秒ごとにトリガーされます(5,20,35,50)
(6)#
シリアル番号(月の最初の数週間を表します)。たとえば、週フィールドに「6#3」を設定すると、毎月第3土曜日になります(母の日と父の日に適しています)
(7)週英語の文字が使用されている場合、フィールドの設定は大文字と小文字を区別しません。つまり、MONはmonと同じです
(8)L
は最終的な意味を意味します。日フィールドの設定では、月の最終日を意味し(現在の月によると、2月の場合は、収益性の高い年であるかどうかが自動的に判断されます)、週フィールドでは、土曜日を意味します。これは、「7」または「SAT」に相当します(日曜日に注意してください)。初日です)。「L」の前に数字を追加すると、データの最後の数字を意味します。たとえば、週フィールドに「6L」の形式を設定すると、「その月の最後の金曜日」を意味します
(9)W
指定した日付から最も近い営業日(月〜金)を示します。たとえば、「日」フィールドに「15W」を設定すると、毎月15日に最も近い営業日にトリガーがトリガーされます。15日が土曜日の場合は、トリガーする最も近い金曜日(14日)を見つけます。15日が平日である場合は、15日が営業日(月曜日から週)である場合は、トリガーする最も近い次の月曜日(16日)を見つけます。 5)、その日にトリガーされます。指定したフォーマットが「1W」の場合、毎月1日以降の最も近い営業日にトリガーすることを意味します。1日が土曜日に当たる場合、次の月曜日の3日にトリガーされます。(「 - 」特定の番号が間隔許可されていない前にのみ設定することができ、「W」注)
(10)L
とW
の組み合わせであることができます。日フィールドに「LW」が設定されている場合は、その月の最終営業日にトリガーされることを意味します(通常は給与を指します)
では@Scheduled
、単純なcronの発現注釈に、トリガー5秒ごとに一度
@Scheduled(cron = "0/5 * * * * ?")
public void cron() {
System.out.println("cron>>"+new Date());
}
2、2番目の方法:Quartz
通常、プロジェクトでは、ビジネスに関連@Scheduled
する通常のタスクが注釈を使用して通常のタスクを解決するのが非常に簡単でない限り、またはほとんどの場合、Quartzを使用して通常のタスクを実行する可能性があります。Spring BootでQuartzを使用するには、プロジェクトの作成時にQuartzの依存関係を追加するだけで済みます。
プロジェクトが作成されたら、スケジュールされたタスクを開始するためにコメントを追加する必要もあります。
@SpringBootApplication
@EnableScheduling
public class QuartzApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzApplication.class, args);
}
}
Quartzを使用するプロセスでは、2つの重要な概念があります。1つはJobDetail(何をするか)で、もう1つはトリガー(いつ行うか)です。JobDetailを定義するには、最初にJobを定義する必要があります。Jobを定義する方法は2つあります。
最初の方法は、Beanを直接定義することです。
@Component
public class MyFirstJob {
public void sayHello() {
System.out.println("first job say hello:" + new Date());
}
}
この定義に関する2つのポイント:
(1)最初にこのジョブをSpringコンテナに登録します。
(2)この定義方法には欠点があります。つまり、パラメーターを渡すことができません。
方法の2番目の定義は、継承QuartzJobBean
され、デフォルトのメソッドを実装します。
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("second job say hello:" + name + ":" + new Date());
}
}
最初の方法と比較して、この方法はパラメーターの受け渡しをサポートしており、タスクの開始時にこの方法executeInternal
が実行されます。
Jobが完了したら、次のようにクラス、構成JobDetail
、およびTrigger
トリガーを作成します。
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
@Bean
JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
JobDataMap map = new JobDataMap();
map.put("name", "Yolo");
bean.setJobDataMap(map);
bean.setJobClass(MySecondJob.class);
return bean;
}
@Bean
SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
bean.setStartTime(new Date());
bean.setRepeatInterval(2000);
bean.setRepeatCount(3);
return bean;
}
@Bean
CronTriggerFactoryBean cronTriggerFactoryBean() {
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setJobDetail(jobDetailFactoryBean().getObject());
bean.setCronExpression("* * * * * ?");
return bean;
}
@Bean
SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTriggerFactoryBean().getObject());
return bean;
}
@Bean
HelloService helloService() {
return new HelloService();
}
}
構成手順:
(1)がありJobDetailを設定するには、2つの方法があります
MethodInvokingJobDetailFactoryBean
とJobDetailFactoryBean
。
(2)MethodInvokingJobDetailFactoryBean
ターゲットBeanの名前名とターゲットメソッドを構成するために使用します。このアプローチは、大量参加をサポートしていません。
(3)を使用JobDetailFactoryBean
してJobDetail
、から継承するタスククラスを構成します。QuartzJobBean
これにより、パラメーターの受け渡しをサポートし、JobDataMap
渡されたパラメーターにカプセル化されます。
(4)はTrigger
、トリガーを指します。Quartz
複数のトリガーがそれに定義されています。私はあなたにそれらの2の使用方法が表示されますここで、SimpleTrigger
とCronTrigger
。
(5)SimpleTrigger
その@Scheduled
基本的な使用法の前にいくらか似ています。
(6)CronTrigger
は式の使用法にいくぶん似て@Scheduled
いcron
ます。
ことがわかるSimpleTriggerFactoryBean
コントロールfirst job
2秒の間隔は、3つの印刷印刷
CronTriggerFactoryBean
制御をsecond job
毎秒印刷後、