springboot について詳しく知りたい場合は、次をクリックしてください: JAVA チュートリアル
##SpringBoot を使用してスケジュールされたタスクを作成するのは非常に簡単です。現在、タスクを作成するには主に 3 つの方法があります:
1. アノテーション (@) に基づくScheduled)
2. インターフェイス ベース (SchedulingConfigurer) 前者については誰もがよく知っていると思いますが、実際の使用では、データベースから指定された時刻を読み取って、スケジュールされたスケジュールを動的に実行することがよくあります。現時点では、インターフェイスベースのタイミングでタスクが役に立ちます。
# 3. 注釈に基づいてマルチスレッドのスケジュールされたタスクを設定する#1. 静的: 注釈に基づいて
注釈に基づく@Scheduled
デフォルトはシングルスレッドであり、複数のタスクが開始されると、タスクの実行時間は前のタスクの実行時間の影響を受けます。#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. 動的: インターフェイスに基づく インターフェイス (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 ('1', '0/5 * * * * ?');
次に、データ ソースを application.yml に追加します。プロジェクト内: spring:
datasource:
url: jdbc:mysql://localhost:3306/socks
username: root
password: 123456
具体的なコードは次のとおりです:
@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 回実行されるように実行サイクルを変更します。
注:
データベースの変更時にフォーマット エラーが発生した場合、変更が行われても、スケジュールされたタスクは停止します。は正しいです。現時点では、プロジェクトを再起動して復元するだけです。 #3. マルチスレッドのスケジュールされたタスク#注釈に基づいてマルチスレッドのスケジュールされたタスクを設定します
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 サイトの他の関連記事を参照してください。