Spring Bootチュートリアル(21)。Quartzタイムドタスクを使用したSpring Boot
ゼロベースで、わかりやすく、そしてとても面白いものを共有することができます。 人工知能チュートリアル (直接クリックしてアクセスできない場合は、"右クリック"-> "新しいタブでリンクを開く")で開いてください。 ウェブサイト https://www.cbedai.net/gnailoug/
前回はSpring独自のタスクスケジューリングについて説明しましたが、今回は情報をメモリに置いたりデータベースに置いたりできるQuartzのタスクスケジューリングを紹介し、それぞれのアプローチについて説明します。
I. インメモリ方式でQuartzを使う
1. 簡単なSpring Bootプロジェクトの作成
pom.xmlの内容は、以下の通りです。
<?xml version="1.0" encoding="UTF-8"? >
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.songguoliang</groupId>
<artifactId>spring-boot-quartz</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring-boot-quartz</name>
<description>Spring Boot Tutorial (XXI): Spring Boot Using Quartz Timed Tasks</description>
<! -- Spring Boot launcher parent class -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <! -- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<! -- Spring Boot web launcher -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<! -- quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. タスクの作成
ここでは、固定間隔とクーロン式のデモのために2つのタスクが作成されています。
TestTask1 は以下のように読みます。
package com.songguoliang.springboot.quartz;
import org.quartz.JobExecutionContext;
import org.Quartz.JobExecutionException;
import org.springframework.scheduling.quartz;
import java.text.SimpleDateFormat;
import java.util;
/**
* @Description
* @Author sgl
* @Date 2018-06-26 16:43
*/
public class TestTask1 extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("TestQuartz01----" + sdf.format(new Date())));
}
}
TestTask2は次のように読みます。
package com.songguoliang.springboot.quartz;
import org.quartz.JobExecutionContext;
import org.Quartz.JobExecutionException;
import org.springframework.scheduling.quartz;
import java.text.SimpleDateFormat;
import java.util;
/**
* @Description
* @Author sgl
* @Date 2018-06-26 16:52
*/
public class TestTask2 extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("TestQuartz02----" + sdf.format(new Date())));
}
}
3. 時間指定タスクの設定
を作成します。
QuartzConfig
クラスを作成し
@Configuration
アノテーションは次のようになります。
package com.songguoliang.springboot.quartz;
import org.Quartz.CronScheduleBuilder;
import org.Quartz;
import org.Quartz;
import org.Quartz;
import org.Quartz;
TriggerBuilder; import org.Quartz;
import org.springframework.context.annotation;
import org.springframework.context.annotation;
Configuration; /**
configuration; /* * @Description
* @Author sgl
* @Date 2018-06-26 16:45
*/
@Configuration
public class QuartzConfig {
@Bean
public JobDetail testQuartz1() {
return JobBuilder.newJob(TestTask1.class).withIdentity("testTask1").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger1() {
//execute once every 5 seconds
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)
.repeatForever();
return TriggerBuilder.newTrigger().forJob(testQuartz1())
.withIdentity("testTask1")
.withSchedule(scheduleBuilder)
.build();
}
@Bean
public JobDetail testQuartz2() {
return JobBuilder.newJob(TestTask2.class).withIdentity("testTask2").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger2() {
//cron method, execute every 5 seconds
return TriggerBuilder.newTrigger().forJob(testQuartz2())
.withIdentity("testTask2")
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ? "))
.build();
}
}
testTask1 で使用した固定間隔方式と testTask2 で使用した cron 式方式です。
4.テスト
サービスを開始すると、コンソールに次のようなメッセージが出力されます。
II. Quartz関連情報のデータベースへの格納方法について
データベースに情報を格納する以上、データベースを扱わなければならないので、上記のコードをベースに、mybatisなどデータベースを直接扱う関数を統合します。 Spring Bootチュートリアル(IX)。Spring Bootの統合マッパー4 を使用して、ソースコードの上にQuartz関連のコンテンツを追加します。
1. Quartzの依存関係を追加する
<! -- quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2. 時間指定タスクの作成と設定
このコードは、記憶のアプローチの際にすでに上に掲載されたので、ここでは繰り返さず、直接、前の
com.songguoliang.springboot.quartz
パッケージで、詳細はソースコードを参照してください。
3. スキーマを追加する
注意:サービス起動のたびに Quartz 関連テーブルを再初期化する必要がない場合は、スキーマファイルを置く必要はなく、あらかじめデータベースに関連テーブルを作成しておき、そのまま次のステップに進むことが必要です。
resourcesディレクトリにschemaフォルダを作成し、そこにmysqlスクリプトファイルを配置します。mysqlデータベースを使用していない場合は、Quartzのウェブサイトから直接ダウンロードできます(docs/dbTablesファイルの中)以下のとおりです。 http://d2zwv9pap9ylyd.cloudfront.net/quartz-2.2.3-distribution.tar.gz
スキーマファイル下のtables_mysql.sqlの内容は以下のとおりです。
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_BLOB_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);
CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);
CREATE TABLE QRTZ_SCHEDULER_STATE
(
SCHED_NAME VARCHAR(12)
4. application.propertiesに適切な設定を追加します。
application.properties設定ファイルに、jobStoreTypeをjdbcに指定して、以下の設定を追加してください。
## quartz
## quartz uses a database store
spring.quartz.job-store-type=jdbc
Quartz 関連のテーブルを事前に作成しておらず、サービス起動時に毎回自動で初期化する場合は、以下を追加する必要があります。
# reinitialize Quartz-related tables in the database each time you start. If you don't need to recreate the tables each time you start the service, you can leave the following two items unconfigured and create the Quartz-related tables in the database beforehand
spring.quartz.jdbc.initialize-schema=always
# Initialize script
spring.quartz.jdbc.schema=classpath:schema/tables_mysql.sql
5. テスト
結果は、上記のインメモリアプローチと同じです。データベースストレージのアプローチとインメモリストレージのアプローチの主な違いは、デフォルトのSpring Bootの
spring.quartz.job-store-type=memory
から
spring.quartz.job-store-type=jdbc
.
6. cron式
cronの表現については、前回の記事で説明しましたので、参考にしてください。 Spring Bootチュートリアル(20): Spring Bootでストリングタスクの時限タスク
<ブロッククオートゼロベースでわかりやすく、そしてとても面白いものを共有する 人工知能チュートリアル (直接クリックしてアクセスできない場合は、"右クリック"-> "open link in new tab" で開いてください。) ウェブサイト https://www.cbedai.net/gnailoug/
関連
-
ブラウザの警告 ダウンロードしたフォントのデコードに失敗しました システムページのフォントアイコンが読み込まれていません(オンライン環境のフォントアイコンが表示されていません)。
-
リソースの読み込みに失敗しました: サーバーはステータス 404 で応答しました ()
-
[問題解決】JSONパースエラー。不正な非引用符合文字 ((CTRL-CHAR, code 13)): を使ってエスケープする必要があります。
-
ローカルリソースのロードが許可されていません。エラー解決
-
springboot(16) ユニットテストを利用したSpring Boot
-
Springbootのリターンデータエラー com.fasterxml.jackson.databind.exc.InvalidDefinitionException
-
springboot integration cxf webservice encountered pitfalls com.ctc.wstx.exc.WstxEOFException.WstxEOFException.WstxEOFException.WstxEOFException.WstxEOFException: プロローグで予期しないEOFが発生する
-
コマンドラインが長すぎます。
-
JsonParseException: 不正な文字 ((CTRL-CHAR, コード 31))
-
不正な引用符なしの文字((CTRL-CHAR, コード 9)):含めるにはバックスラッシュでエスケープする必要がある i
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン