#### [Spring Quartz](https://www.baeldung.com/spring-quartz-schedule)
1. QRTZ_JOB_DETAILS:用於保存具體工作的詳細資訊,如工作名稱、工作群組、工作類別等。
2. QRTZ_TRIGGERS:用於保存觸發器的詳細資訊,如觸發器名稱、觸發器群組、觸發器類別等。
3. QRTZ_SIMPLE_TRIGGERS:用於保存簡單觸發器的資訊,如觸發次數、重複間隔時間等。
4. QRTZ_CRON_TRIGGERS:用於保存cron觸發器的資訊,如cron表達式、時區等。
5. QRTZ_JOB_LISTENERS:用於保存與工作有關的監聽器資訊。
6. QRTZ_TRIGGER_LISTENERS:用於保存與觸發器有關的監聽器資訊。
7. QRTZ_CALENDARS:用於保存行事曆的資訊,如排除特定日期、時間等。
8. QRTZ_SCHEDULER_STATE:用於保存調度器的狀態資訊,如啟動時間、執行狀態等。
---
Spring Boot Quartz 是一個強大的任務調度框架,可以幫助開發人員輕鬆管理定時任務。
在 Spring Boot Quartz 中,流程如下:
1. 配置任務的相關信息,包括任務的類型、觸發器的類型、執行時間等。
2. 將任務的相關信息存儲到 QRTZ_JOB_DETAILS、QRTZ_TRIGGERS、QRTZ_CRON_TRIGGERS 或 QRTZ_SIMPLE_TRIGGERS 表格中。
3. 啟動 Spring Boot 應用程序,Quartz 將根據配置的時間來觸發任務。
4. 當觸發器觸發時,Quartz 將根據任務的信息執行相應的任務。
5. 如果使用了 QRTZ_LOCKS 表格,在執行任務時會進行鎖定檢查,確保同一時間只有一個觸發器在執行該任務。
總的來說,Spring Boot Quartz 提供了一個方便而強大的任務調度框架,可以幫助開發人員更好地管理定時任務。通过對各表格用途及流程的詳細了解,可以更好地使用 Spring Boot Quartz 來實現任務調度功能。
---
### QRTZ_JOB_DETAILS
在Spring Boot Quartz中,QRTZ_JOB_DETAILS表用於存儲定義的作業任務(job)的詳細信息。每個作業任務對應一條記錄,該記錄包含了該任務的唯一標識符、任務類別、任務描述等信息。
具體來說,QRTZ_JOB_DETAILS表中常見的字段包括:
- JOB_NAME:作業任務的名稱,唯一標識符。
- JOB_GROUP:作業任務所屬的組名。
- DESCRIPTION:作業任務的描述信息。
- JOB_CLASS_NAME:作業任務的類別,即執行任務的類別。
- IS_DURABLE:該任務是否持久,即在沒有關聯觸發器時是否仍然保留。
- IS_NONCONCURRENT:該任務是否佔用資源,即是否同時執行。
- IS_UPDATE_DATA:在預定執行時是否更新資料。
QRTZ_JOB_DETAILS表的主要作用是管理作業任務的定義信息,包括任務的執行方式、描述、唯一標識符等。通過設置這些信息,可以實現對作業任務的管理和控制,從而實現定時執行任務的功能。
### QRTZ_TRIGGERS
在Spring Boot中使用Quartz時,QRTZ_TRIGGERS表是用來存儲所有的觸發器(trigger)信息的。每當一個作業(job)被安排執行時,都會生成一個對應的觸發器(trigger)並存儲在QRTZ_TRIGGERS表中。
QRTZ_TRIGGERS表的主要用途包括:
1. 存儲觸發器的基本資訊,如觸發器的名稱、所屬的作業(job)名稱、觸發器的觸發時間等。
2. 紀錄觸發器的狀態,如觸發器的啟用狀態、上次觸發時間、下次預定觸發時間等。
3. 提供觸發器的操作和管理功能,如新增觸發器、移除觸發器、暫停觸發器、恢復觸發器等。
4. 與其他Quartz組件進行關聯和查詢,如作業(job)、觸發器群組、工作調度器等。
總的來說,QRTZ_TRIGGERS表是Spring Boot中Quartz調度框架的重要組件,通過它可以有效管理和控制觸發器的執行,確保作業(job)按照預定的時間表執行。
### QRTZ_CRON_TRIGGERS
在Spring Boot應用程式中使用Quartz時,QRTZ_CRON_TRIGGERS是Quartz框架中存儲Cron Trigger(定時器)相關資訊的資料表。這個表格用於記錄定時器的配置,包括Trigger名稱、Trigger群組、Trigger描述、Cron表達式等。Cron表達式是一種定義定時任務執行時間的方式,它包含秒、分鐘、小時、日期等時間參數。
在QRTZ_CRON_TRIGGERS表中,每條記錄代表一個Cron Trigger的設置,用於定義定時任務的執行時間。透過這個表格,可以方便地管理定時器的設定與觸發條件,包括定時任務的開始時間、結束時間、重複間隔等。
通常在Spring Boot應用程式中使用Quartz時,會通過Quartz提供的API來操作QRTZ_CRON_TRIGGERS表,例如新增、編輯、刪除定時器等操作。透過QRTZ_CRON_TRIGGERS表的設置,可以實現定時執行任務的功能,並且根據需求靈活調整執行時間。
### QRTZ_CALENDARS
在Spring Boot Quartz中,QRTZ_CALENDARS是一個用來定義特定日期與時間規則的表格。它可以被用來建立各種不同的日曆規則,如每月最後一天、每周特定天或每年特定日期等。
QRTZ_CALENDARS表格可以用來設置特定的日期,並使定時器在指定的日期觸發作用。這對於需要在特定日期執行任務的應用程式來說非常有用,例如定期進行結算、生成報告或執行特定的活動等。
使用QRTZ_CALENDARS可以幫助開發人員更靈活地控制定時任務的執行時間,並確保它們按照預期的日期規則執行。這將大大提高應用程式的效率和可靠性。
### QRTZ_LOCKS
QRTZ_LOCKS 是 Spring Boot Quartz 框架中的一個表,用於實現分布式鎖定(distributed locking)功能。在多個應用程序實例中運行時,可能會有多個實例同時執行 Quartz 任務調度,造成競爭條件或重複執行任務的問題。
QRTZ_LOCKS 表的作用是提供一個機制,能夠確保同一時間只有一個實例可以執行特定的任務調度。當一個實例想要執行任務時,它會試圖獲得該任務對應的鎖定記錄。如果成功獲得鎖定,那麼該實例就可以安全地執行該任務。如果無法獲得鎖定,則代表其他實例正在執行該任務,當前實例需要等待。
總結來說,QRTZ_LOCKS 表確保了在分佈式環境下,Quartz 任務的唯一執行性,避免了競爭條件和重複執行的問題,從而確保了任務調度的準確性和可靠性。
### 建立 Cron Trigger
創建一個 Cron Trigger 來指定觸發時間:
```java
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 * 1/1 * ? *"))
.build();
```
以上範例中的 CronScheduleBuilder.cronSchedule("0 0/5 * 1/1 * ? *") 表示每隔5分鐘觸發一次。
### 建立特定時間 Trigger
```java
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(new Date(specificUnixTime)) // 設定觸發時間點
.build();
```
---
### 刪除內容
``` sql
delete from batch_job_execution_context;
delete from batch_job_execution_params;
delete from batch_step_execution_context;
delete from batch_job_execution;
delete from batch_step_execution;
delete from batch_job_instance;
delete from qrtz_blob_triggers;
delete from qrtz_calendars;
delete from qrtz_cron_triggers;
delete from qrtz_fired_triggers;
delete from qrtz_locks;
delete from qrtz_paused_trigger_grps;
delete from qrtz_scheduler_state;
delete from qrtz_simple_triggers;
delete from qrtz_simprop_triggers;
delete from qrtz_triggers;
delete from qrtz_job_details;
-- 工作實體
select * from batch_job_instance;
-- 工作執行
select job_execution_id, version, job_instance_id, create_time, start_time, end_time, status, exit_code from batch_job_execution order by 1 desc;
-- 步驟執行
select step_execution_id, version, step_name, job_execution_id, create_time, start_time, end_time, status from batch_step_execution order by 1 desc;
-- 步驟執行文本
select step_execution_id, short_context from batch_step_execution_context order by 1 desc;
-- 輸入參數
select * from batch_job_execution_params;
```
### JobData
在 Quartz 中,可以使用 JobDataMap 物件來存儲與 Job 相關的資料。當您建立一個 JobDetail 物件時,可以將一個 JobDataMap 物件傳入其中,以便在執行 Job 時存取這些資料。以下是一個簡單的範例來展示如何使用 JobDataMap:
首先,建立一個 Job 類別,類別中包含一個可以存取 JobData 的方法。
```java
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// 從 JobDataMap 中取得資料
String jobData = dataMap.getString("jobDataKey");
// 印出取得的資料
System.out.println("Job 資料: " + jobData);
}
}
```
接著,在 Scheduler 中建立 JobDetail 物件時,將包含資料的 JobDataMap 物件傳入其中。
```java
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobDataMap;
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobDataKey", "這是我的 Job 資料");
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob")
.usingJobData(jobDataMap)
.build();
```
當 Scheduler 啟動並執行這個 Job 時,Job 中的 execute 方法可以透過 JobDataMap 存取及操作 JobData。這樣就可以方便地將任何需要的資料傳遞給 Job 並在執行期間使用。希望這個範例可以幫助您了解如何使用 JobDataMap 在 Quartz 中傳遞及存取資料。