SpringBootでのタイミングタスクの使用方法の詳細


詳細
本文は通俗的な言語で退屈な知識を述べることを目的とする.
定時タスクは1種のシステムスケジューリングツールとして、いくつかの定時作業が必要なシステムの中で広く応用されている.例えば、ある時点の統計データに会うたびに、将来ある時点でいくつかの動作を実行する.定時タスクは主流の開発言語で開発者の呼び出しに対応するAPIを提供し、Javaでは、定時タスクを実現するには多くの方法がある.オリジナルの方法で完全なタイミングタスクを実現するには、Timer、TimerTaskの2つのクラスが必要です.Timerはタイマクラスで、バックグラウンドスレッドを計画通りに開いて指定されたタスクを実行します.TimerTaskは抽象クラスで、そのサブクラスはTimerによって計画されるタスクを代表します.このほか、ScheduledExecutorServiceクラスやサードパーティjarライブラリQuartzを使用することもできます.Quartzは優れたタイミングタスクフレームワークであり、現在まで非常に成熟しており、その後、他のタイミングタスクフレームワークの核心思想や下層の多くはQuartzに由来しています.
SpringbootはJavaの開発フレームワークとして、springbootプロジェクトでタイミングタスクを実現するにはJavaが提供するオリジナル方式だけでなく、springbootが提供するタイミングタスクAPIも使用できます.以下、Javaオリジナルとspringbootのすべてのタイミングタスクを実現する方式を統合します.
記事の概要:
1、スレッドの使用
2、Timerクラスの使用
3、ScheduledExecutorServiceクラスの使用
4、Quartzを使う
5、springの@Scheduled注記を使う
6、cron式
1.スレッド実装
スレッドを用いてスリープ時間を設定できる方式で簡単なタイミングタスクロジックを実現できる.
    public static void main(String[] args){
        //        
        int sleepTime=2*1000;
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    try {
                        System.out.println("Thread          ");
                        //        
                        Thread.sleep(sleepTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

2.Timerクラス
Timerクラスでは、TimerTaskタスクをスケジュールできます.この方法を使用すると、プログラムをある頻度で実行することができます.
    public static void main(String[] args){
        int sleepTime=2*1000;
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Timer          ");
            }
        };
        new Timer().schedule(timerTask,1,sleepTime);
    }

3.ScheduledExecutorServiceクラス
ScheduledExecutorServiceは、スレッドプールに基づいて設計されたタイミングタスククラスであり、各スケジューリングタスクはスレッドプール内のスレッドに割り当てられて実行されます.つまり、タスクは同時実行であり、互いに影響しません.したがって,ScheduledExecutorServiceクラスに基づくタイミングタスククラスは,あくまでもスレッドベースのスケジューリングで実現される.
    public static void main(String[] args){
        int sleepTime=2*1000;
        ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutor.scheduleAtFixedRate(
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("ScheduledExecutorService          ");
                    }
                }
        ,1,sleepTime, TimeUnit.SECONDS);
    }

4.Quartzの統合
QuartzはJavaによって完全に作成されたオープンソースジョブスケジューリングフレームワークであり、Javaアプリケーションでジョブスケジューリングを行うために簡単で強力なメカニズムを提供しています.その使用方法を理解するには、まずそのいくつかの核心概念を理解する必要があります.
Job: 1つの仕事、実行する具体的な内容を表します.このインタフェースには、という方法しかありません.
void execute(JobExecutionContext context)
JobDetail: 具体的な実行可能なスケジューラを表し、Jobはこの実行可能なスケジューラが実行する内容であり、JobDetailはこのタスクのスケジューラのシナリオとポリシーも含んでいる.
Trigger: スケジューリングパラメータの構成を表し、いつ調整しますか.
Scheduler: 1つのスケジューラを表し、1つのスケジューラに複数のJobDetailとTriggerを登録できます.TriggerをJobDetailと組み合わせると、Schedulerコンテナによってスケジュールされます.
これらの概念があれば、Quartzをspringbootプロジェクトに統合することができます.
quartz依存の導入
<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-quartzartifactId>
dependency>

構成
@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail quartzDetail(){
        return JobBuilder.newJob(QuartzTest.class).withIdentity("QuartzTest").storeDurably().build();
    }
    @Bean
    public SimpleTrigger quartzTrigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(quartzDetail())
                .withIdentity("QuartzTest")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

テスト
public class QuartzTest extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext){
        System.out.println("quartz         ");
    }
}

5.Scheduled注記の使用
@Scheduledはspringがタイミングタスクのために生成した注釈で、注釈のソースコードを表示します.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
//cron   
    String cron() default "";
//    java.util.TimeZone#ID。
    String zone() default "";
//                   
    long fixedDelay() default -1;
//              fixedDelay
    String fixedDelayString() default "";
//                   
    long fixedRate() default -1;
//              fixedRateString
    String fixedRateString() default "";
//                 
    long initialDelay() default -1;
//              initialDelay
    String initialDelayString() default "";
}

Scheduled注記のパラメータは「タイミング」動作を設定するために使用されます.通常、よく使われるパラメータはcron()です.これは、cron式に関する文法を学ぶ必要があることを意味しますが、内容が多く、編幅が長いため、ここでは説明を省略し、cron文法に関することを文章の最後に置きます.ここでは、スケジュール注記を使用してタイミングタスクを実現する方法について説明します.
オープンタイミングタスクサポート
@SpringBootApplication
/**
 *         
 */
@EnableScheduling
public class TestApplication  extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}

を使用
@Component
public class ScheduledTest {
    private Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
    /**
     *  15         
     */
    @Scheduled(cron = "0/15 * * * * ? ")
    public void testCron(){
        logger.info("Scheduled         ");
    }
}

6.cron式
cron式は文字列です.構文は次のとおりです.
[ ] [ ] [  ] [ ] [ ] [ ] [ ]

ここで[年]は必須ではないため、通常cron式は通常6または7の部分から構成され、内容の値は数字またはいくつかのcron式で約束された特殊文字であり、これらの特殊文字は「ワイルドカード」と呼ばれ、各ワイルドカードはそれぞれ1つの値を指す.cron式は、次のような表で表すことができます.
シーケンス値範囲特殊文字列範囲

0~60
, - */

0-60
, - */

0-23
, - */

1-31
, - */

1-12/JAN-DEC
, - * ?/L W

1-7/SUN-SAT
, - * ?/L #
年(省略可)
1970-2099
, - */
ワイルドカードの解釈と役割は次のとおりです.
ワイルドカードが表す値の解釈
*
すべての値
たとえば、時間ごとにトリガーされる時間フィールドは*です.
?
値を指定しない
例:週フィールドは?代表式は気にしないで何週間ですか.
-
区間
たとえば、時フィールドは2-5に設定され、2、3、4を表し、5時にトリガーされます.
,
複数の値
たとえば、時フィールド設定2,3,5は、2,3を表し、5時にトリガーされます.
/
ぞうか
例えば:時フィールドは0/2を設定して、2時間ごとにトリガーすることを表して、時フィールドは2/5を設定して、2時から5時間ごとにトリガーすることを表します
L
最後の値
例えば、日フィールド設定Lは、今月の最終日を表す
W
最近の平日
例えば、在日フィールドに13 Wを設定し、約13日最近の平日に1回トリガしなかったことを表す
#
シーケンス番号
たとえば、週フィールドに5#2を設定し、毎月の第2金曜日を表します.
例:
2秒ごとに実行:0/5 ?
5分ごとに実行:0/5 * ?
1分、12分、45分に1回実行:0 1,12,45 * ?
毎日23時59分59秒に1回実行:59,523 ?
毎月15日午前3時に1回実行:0 0 3 15*?
毎月の最終日12時に1回実行:0 0 0 12 L*?
本文はあなたに役に立つと思いますか?もっと多くの人に分かち合ってください
「プログラミングに限界がない」ことに注目し、詰め込みスキルを向上させる