Spring Quartz

Posted by Adam on August 24, 2022
#### [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 中傳遞及存取資料。