<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>2.5.2</version> </dependency>
Quartz は、単一アプリケーション プロジェクトで一般的に使用されるスケジュールされたタスク フレームワークです。スケジュールされたタスクは主に次のように分類できます。
メモリ内のタスク : 通常、プロジェクトが再起動された場合、タスクが再起動されていない場合は、プロジェクト内に定義され、保存されます。自動的に実行され、再度オンになることはありません。
永続タスク: タスクの特性をデータベースに保存し、プロジェクトの再起動後に、最初に実行していたタスクを再読み込みして実行を継続できます。
corn
は、タスクがトリガーされる時間を制御するために使用されます。
一般的に使用されるものをいくつかリストします:
Trigger each Second
"* * * * * *":
Every 5 Execute 1 秒に 1 回
*/5 * * * * ?
1 分ごとにトリガー
"0 * * * * ?"
毎日 10 時に 1 回トリガー
"0 * * * * ?"
毎日 0 時に 1 回トリガーo' Clock
"0 0 10 * * ?"
プロジェクトの開始時に実行されるタスク実行タスクを直接定義します。例:
"0 0 0 * * ?"
起動クラス:
@Service public class ScheduleTest { @Scheduled(cron = "0/1 * * * * *") public void test() { System.out.println("测试"); } }
起動後、対応する内容がコンソールに出力されます。 タスクを手動で制御する
ここでは、タスクを自分で定義する必要があります。
タスクの定義
Jobインターフェイスを実装すると、タスクを定義でき、このタスクの開始を手動で制御できます。
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
依存関係のインポート:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("自定义任务");
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
コントローラーの書き込み、これは固定された書き込み方法です。
タスクを指定します:
JobBuilder.newJob(task.class) .withIdentity(タスク名, タスクグループ).build();cron 式を指定してトリガーを作成します:
scheduler.scheduleJob (タスク タイプ オブジェクト、ランチャー オブジェクト)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.6.RELEASE</version> </dependency>
と入力すると、タスク実行の出力内容がコンソールに出力されていることがわかります。 Persistence
スケジュールされたタスクは再起動されません。解決策はタスクを永続化することです。Quartz
が解決策を提供し、SpringBoot がこの操作を簡素化します。構成する必要があるのは、データベース、データ ソース、およびデータベースを操作するための JDBC だけです。
/** * @ClassName * @Description * @Author:chengyunlai * @Date * @Version 1.0 **/ @RestController public class DynamicScheduleController { @Autowired private Scheduler scheduler; @GetMapping("/addSchedule") public String addSchedule() throws SchedulerException { int random = ThreadLocalRandom.current().nextInt(1000); // 1. 创建JobDetail,指定定时任务实现类的类型 JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity("test-schedule" + random, "test-group").build(); // 2. 创建Trigger,并指定每3秒执行一次 CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?"); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group") .withSchedule(cron).build(); // 3. 调度任务 scheduler.scheduleJob(jobDetail, trigger); return "success"; }
mysql データベースを使用します: そのドライバー mysql-connector-java をインポートします。
Druid をデータ ソースとして使用します: druid。
spring-jdbc を使用すると、タスク情報をデータベースに自動的に保存できます。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
quartz- を見つけます。 2.3.0-SNAPSHOT \src\org\quartz\impl\jdbcjobstore
次に、一連のsql ファイルがあるので、データベースに一致する SQL ファイルを見つけてください。私は mysql を使用します。
SQL ファイルを実行してテーブルを作成します。データベース名は
です。URL から確認できるはずです。 テーブルの作成が完了したら、すべての構成作業が終了します。プログラムを起動し、ブラウザに「
」と再入力し、データベースを更新すると、次のことがわかります。タスクが永続化されていること プロジェクトを再起動した後も、タスクは引き続き自動的に実行されます。
タスクの一時停止とタスクの削除タスクを手動で開始するときは、以下を指定します:
タスクの名前とグループ
# 设置将定时任务的信息保存到数据库 spring.quartz.job-store-type=jdbc # 每次应用启动的时候都初始化数据库表结构 # 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建! # 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never spring.quartz.jdbc.initialize-schema=never # 数据库配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root
JobKey.jobKey (タスク名、タスク グループ)
を使用してscheduler.pauseJob(jobkey)
はタスクを一時停止でき、タスクを削除するときは、タスクとトリガーの両方を削除する必要があります。上記で、タスクを表す
jobkey を取得できます。また、同様に、ランチャーの名前とグループも定義しました。
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();
trigger を取得することもできます。
通过以下顺序完整删除任务
scheduler.deleteJob(jobKey);
scheduler.unscheduleJob(triggerKey);
scheduler.pauseTrigger(triggerKey);
// 停止触发器
// 移除触发器
// 删除任务
// 暂停 @GetMapping("/pauseSchedule") public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException { JobKey jobKey = JobKey.jobKey(jobName, jobGroup); // 获取定时任务 JobDetail jobDetail = scheduler.getJobDetail(jobKey); if (jobDetail == null) { return "error"; } scheduler.pauseJob(jobKey); return "success"; } // 恢复 @GetMapping("/remuseSchedule") public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException { JobKey jobKey = JobKey.jobKey(jobName, jobGroup); // 获取定时任务 JobDetail jobDetail = scheduler.getJobDetail(jobKey); if (jobDetail == null) { return "error"; } scheduler.resumeJob(jobKey); return "success"; } // 删除定时任务 @GetMapping("/removeSchedule") public String removeSchedule(String jobName, String jobGroup, String triggerName, String triggerGroup) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); Trigger trigger = scheduler.getTrigger(triggerKey); if (trigger == null) { return "error"; } // 停止触发器 scheduler.pauseTrigger(triggerKey); // 移除触发器 scheduler.unscheduleJob(triggerKey); // 删除任务 scheduler.deleteJob(jobKey); return "success"; }
以上がQuartz を SpringBoot と統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。