Springboot タイミング タスクの詳細な説明


プロジェクト開発のプロセスでは、コンテンツの実行に役立つ時間指定タスクが必要になることがよくありますが、Spring Boot にはデフォルトですでに実装されており、対応するアノテーションを追加するだけでそれを実現できます。

1. アノテーションベース(静的)

1.依存関係を追加する

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
  </dependency>

2. スケジュールされたタスクを作成する

タイミングタスク 1:

@Configuration
@EnableScheduling
public class SchedulerTask1 {
    
    

    private int count=0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process(){
    
    
        System.out.println("this is scheduler task runing  "+(count++));
    }

}

時間指定タスク 2:

@Configuration
@EnableScheduling
public class SchedulerTask2 {
    
    

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
    
    
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }

}

結果は次のとおりです。

this is scheduler task runing  0
现在时间:09:44:17
this is scheduler task runing  1
现在时间:09:44:23
this is scheduler task runing  2
现在时间:09:44:29
this is scheduler task runing  3
现在时间:09:44:35

3. パラメータの説明

@Configurationこれは構成クラスをマークするために使用され、コンポーネントの効果があります。

@EnableSchedulingスケジュールされたタスクが有効であることを示します

@Scheduledこのパラメーターは 2 つのタイミング設定を受け入れることができます。1 つは一般的な設定でcron="*/6 * * * * ?"、もう 1fixedRate = 6000つは両方とも 6 秒ごとにコンテンツを印刷することを意味します。

固定レートの説明

  • @Scheduled(fixedRate = 6000):最後の実行時点から6秒後に再度実行します。

  • @Scheduled(fixedDelay = 6000):最後の実行時点から6秒後に再度実行します。

  • @Scheduled(initialDelay=1000, fixedRate=6000): 最初の 1 秒の遅延後に実行し、その後はfixedRate ルールに従って 6 秒ごとに実行します

cron 属性は、タスクの実行ルールを式の形式で指定し、最後のタスクの実行の完了から計時を開始します。表現規則は次のとおりです。

各場所のルールは次のとおりです。

ここに画像の説明を挿入

述べる:

  • アスタリスク (*): すべてのフィールドで使用して、対応する時間フィールドのあらゆる瞬間を示すことができます。たとえば、分フィールドの * は「毎分」を意味します。
  • 疑問符 (?): この文字は日付と週のフィールドでのみ使用され、通常はプレースホルダーに相当する「意味のない値」として指定されます。
  • マイナス記号 (-): 時間フィールドで「10-12」を使用するなど、範囲を表します。これは、10 時から 12 時まで、つまり 10、11、12 を意味します。
  • カンマ (,): リスト値を表します。たとえば、週フィールドに「MON、WED、FRI」を使用すると、月曜日、水曜日、金曜日を意味します。
  • スラッシュ (/): x/y は一連の等しいステップを表します。x は開始値、y は増分ステップ値です。秒フィールドで 0/15 を使用すると、0、15、30、45 秒を意味し、5/15 は分フィールドで 5、20、35、50 を意味します。また、同等の */y を使用することもできます。年0月まで。
  • L: この文字は日付と週のフィールドでのみ使用され、「最後」の意味を表しますが、2 つのフィールドでは異なる意味を持ちます。日付フィールドの L は、うるう年以外の場合は 1 月 31 日や 2 月 28 日など、月の最終日を意味します。L が週の途中で使用される場合は土曜日を意味し、これは次と同等です。 7。ただし、L が曜日フィールドに表示され、その前に数値 X が付いている場合は、「月の最後の X 日」を意味します。たとえば、6L は月の最後の金曜日を意味します。
  • W: この文字は日付フィールドにのみ使用でき、先頭の日付を変更したもので、その日付に最も近い営業日を示します。たとえば、15W は月の 15 日に最も近い営業日を意味します。月の 15 日が土曜日の場合は 14 日の金曜日と一致し、15 日が日曜日の場合は 16 日の月曜日と一致し、15 日が火曜日の場合は、結果は15番火曜日です。ただし、関連付けられた一致する日付は複数の月にまたがることはできないことに注意してください。たとえば、1W を指定した場合、1 日が土曜日の場合、結果は前月の最終日ではなく、3 日の月曜日と一致します。W 文字列では、日付の範囲ではなく、単一の日付のみを指定できます。
  • LW の組み合わせ: LW は日付フィールドで組み合わせることができます。これは、今月の最終営業日を意味します。
  • ポンド記号 (#): この文字は、月の特定の営業日を示す週フィールドでのみ使用できます。たとえば、6#3 は今月の第 3 金曜日を意味し (6 は金曜日、#3 は現在の第 3 金曜日を意味します)、4#5 は今月の第 5 水曜日を意味します (今月には第 5 水曜日がないと仮定します)。 、無視してトリガーしません。
  • C: この文字は日付と週のフィールドでのみ使用され、「カレンダー」の意味を表します。これは、プランに関連付けられた日付を意味します。日付が関連付けられていない場合は、カレンダー内のすべての日付と同等です。たとえば、日付フィールドの 5C は、カレンダーの 5 日後の最初の日に相当します。1C は、曜日フィールドの日曜日の後の最初の日に相当します。
  • cron 式では大文字と小文字が区別されません。

2. インターフェースベース (動的)

1.依存関係を追加する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2. データベースレコードを追加する

次のように、ローカル データベース mysql を開き、クエリ ウィンドウを開いて、スクリプトの内容を実行します。

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

ここに画像の説明を挿入

次に、application.properties ファイルにデータ ソースを追加します。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/socks?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3. タイマーを作成する

データベースでデータの準備ができたら、スケジュールされたタスクを書き込みます。ここで TriggerTask が追加されることに注意してください。目的は、データベースに設定した実行サイクルを読み取り、関連するスケジュールされたタスクの内容を実行することです。
具体的なコードは次のとおりです。

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {
    
    

    @Autowired
    private CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
    

        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
    
    
                    //2.1 从数据库获取执行周期
                    String cron = cronMapper.selectByPrimaryKey("1").getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
    
    
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

4. テストを開始する

次に、Navicat を開き、実行サイクルを 10 秒ごとに実行するように変更し、コンソールを確認すると、実行サイクルが変更されていることを確認できます。これは、アプリケーションを再起動する必要がなく、非常に便利です。図に示すように:

ここに画像の説明を挿入

3. クォーツ

Quartz は、ジョブ スケジューリングの分野における OpenSymphony オープン ソース組織のもう 1 つのオープン ソース プロジェクトであり、J2EE および J2SE アプリケーションと組み合わせたり、単独で使用したりできます。Quartz を使用すると、10、数百、さらには数万のジョブを実行する単純なプログラムまたは複雑なプログラムを作成できます。

1.依存関係を追加する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. タスククラスの書き込み

package com.cn.service;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyQuartz extends QuartzJobBean {
    
    
 
    private final Logger log = LoggerFactory.getLogger(MyQuartz.class);
 
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    
    
        log.info("hello quartz");
    }
 
}

3. 構成クラスの書き込み

package com.cn.config;

import com.cn.service.MyQuartz;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class QuartzConfig {
    
    
 
    @Bean
    public JobDetail myQuartz() {
    
    
        return JobBuilder.newJob(MyQuartz.class).withIdentity("MyQuartz").storeDurably().build();
    }
 
    @Bean
    public Trigger studentRankQuartzTrigger() {
    
    
        return TriggerBuilder.newTrigger().forJob(myQuartz())
                .withIdentity("MyQuartz")
                .withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(5,		
                 DateBuilder.IntervalUnit.SECOND))
                .build();
    }
}

4. プロジェクトを開始する

5秒ごとに「helloquartz」を印刷します

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/jiang_wang01/article/details/131466258