ホームページ >Java >&#&チュートリアル >Springboot のスケジュールされたタスクを作成する方法

Springboot のスケジュールされたタスクを作成する方法

angryTom
angryTomオリジナル
2019-07-26 11:43:5710682ブラウズ

Springboot のスケジュールされたタスクを作成する方法

springboot について詳しく知りたい場合は、次をクリックしてください: JAVA チュートリアル

##SpringBoot を使用してスケジュールされたタスクを作成するのは非常に簡単です。現在、タスクを作成するには主に 3 つの方法があります:

1. アノテーション (@) に基づくScheduled)

2. インターフェイス ベース (SchedulingConfigurer) 前者については誰もがよく知っていると思いますが、実際の使用では、データベースから指定された時刻を読み取って、スケジュールされたスケジュールを動的に実行することがよくあります。現時点では、インターフェイスベースのタイミングでタスクが役に立ちます。

# 3. 注釈に基づいてマルチスレッドのスケジュールされたタスクを設定する

#1. 静的: 注釈に基づいて

注釈に基づく@Scheduled

デフォルトはシングルスレッドであり、複数のタスクが開始されると、タスクの実行時間は前のタスクの実行時間の影響を受けます。

1. タイマーの作成

#SpringBoot を使用してアノテーションに基づいてスケジュールされたタスクを作成するのは非常に簡単で、わずか数回で完了します。コード行。コードは次のとおりです:

@Component
@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class SaticScheduleTask {
    //3.添加定时任务
    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔,例如:5秒
    //@Scheduled(fixedRate=5000)
    private void configureTasks() {
        System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
    }
}

Cron 式パラメータはそれぞれ次のことを表します:

秒 (0 ~ 59) たとえば、0/5 は 5 秒ごとを意味します

分 (0~59)

時間 (0~23)

日 (0~31)、

月 (0~11)# を計算する必要があります

## 曜日 (1 ~ 7 または SUN/MON/TUE/WED/THU/FRI/SAT で入力可能)

@Scheduled

: に加えて柔軟なパラメータ式 cron のサポート さらに、fixedDelay や​​ fixRate など、対応するミリ秒数を入力するだけの単純な遅延操作もサポートしています。

#2. テストの開始

##アプリケーションを開始すると、コンソールに次の情報が出力されることがわかります:

@Scheduled アノテーションの使用は明らかに非常に便利ですが、欠点は、実行サイクルを調整するときに、有効にするためにアプリケーションを再起動する必要があり、やや不便であることです。リアルタイムの効果を実現するために、インターフェイスを使用してスケジュールされたタスクを完了できます。

# 2. 動的: インターフェイスに基づく

Springboot のスケジュールされたタスクを作成する方法

インターフェイス (

SchedulingConfigurer)# に基づく##1. 依存関係パッケージをインポートします

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency><!--添加Web依赖 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!--添加MySql依赖 -->
             <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency><!--添加Mybatis依赖 配置mybatis的一些初始化的东西-->
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency><!-- 添加mybatis依赖 -->
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

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 (&#39;1&#39;, &#39;0/5 * * * * ?&#39;);

次に、データ ソースを application.yml に追加します。プロジェクト内:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/socks
    username: root
    password: 123456

3. タイマーの作成

Springboot のスケジュールされたタスクを作成する方法

#データベースがデータを準備した後、スケジュールされたタスクを書き込みますここでTriggerTaskはループ読み込みの目的で追加されていることに注意して、データベースに設定した実行周期と、関連するスケジュールされたタスクの実行内容を取得します。

具体的なコードは次のとおりです:

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

    @Mapper
    public interface CronMapper {
        @Select("select cron from cron limit 1")
        public String getCron();
    }

    @Autowired      //注入mapper
    @SuppressWarnings("all")
    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.getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

4. テストの開始

アプリケーションを起動した後、コンソールでの印刷時間は、10 秒に 1 回と予想されます:

## 次に、Navicat を開いて、図に示すように、6 秒に 1 回実行されるように実行サイクルを変更します。

コンソールを見ると、実行サイクルが変更されており、アプリケーションを再起動する必要がなく、非常に便利です。図に示すように:

Springboot のスケジュールされたタスクを作成する方法

注:

データベースの変更時にフォーマット エラーが発生した場合、変更が行われても、スケジュールされたタスクは停止します。は正しいです。現時点では、プロジェクトを再起動して復元するだけです。

Springboot のスケジュールされたタスクを作成する方法

#3. マルチスレッドのスケジュールされたタスク

Springboot のスケジュールされたタスクを作成する方法#注釈に基づいてマルチスレッドのスケジュールされたタスクを設定します

1. 作成マルチスレッドのスケジュールされたタスク Task

//@Component注解用于对那些比较中立的类进行注释;
//相对与在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释
@Component
@EnableScheduling   // 1.开启定时任务
@EnableAsync        // 2.开启多线程
public class MultithreadScheduleTask {

        @Async
        @Scheduled(fixedDelay = 1000)  //间隔1秒
        public void first() throws InterruptedException {
            System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
            System.out.println();
            Thread.sleep(1000 * 10);
        }

        @Async
        @Scheduled(fixedDelay = 2000)
        public void second() {
            System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
            System.out.println();
        }
    }

2. テストの開始

アプリケーションを起動した後、コンソールを確認します:

コンソールからわかるように、最初にスケジュールされたタスクと 2 番目にスケジュールされたタスクは相互に影響しません。

さらに、マルチスレッドが有効になっているため、最初のスケジュールされたタスクの実行時間はタスク自体の実行時間にも制限がないため、繰り返し実行するとデータ異常が発生する可能性がありますのでご注意ください。

以上がSpringboot のスケジュールされたタスクを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。