溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Quartz是什么

發布時間:2021-09-13 15:34:37 來源:億速云 閱讀:213 作者:柒染 欄目:大數據

這篇文章給大家介紹Quartz是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。

Quartz核心概念

Job:表示一個工作,要執行的具體內容,此接口中只有一個方法:void execute(JobExecutionContext context)

JobDetail:表示一個具體的可執行的調度程序,Job是這個可執行程序所需要執行的內容,另外,JobDetail還包含了這個任務調度的方案和策略。

Trigger:表示一個調度參數的配置,什么時候去調。

Scheduler:表示一個調度容器,一個調度容器中可以注冊多個JobDetail 和 Trigger。

Quartz運行環境

Quartz可以運行嵌入在另一個獨立式應用程序。

Quartz可以在應用程序服務器(或Servlet容器)內被實例化,并且參與XA事務。

Quartz可以作為一個獨立的程序運行(其自己的JVM內),可以通過RMI使用。

Quartz可以被實例化,作為獨立的項目集群(負載平衡和故障轉移功能),用于作業的執行。

public class Quickstart {
   public static void main(String[] args) {
       try {
           Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
           scheduler.start();
           scheduler.shutdown();
       } catch (SchedulerException e) {
           e.printStackTrace();
       }
   }
}

運行日志如下:

14:53:00.764 [main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor

14:53:00.790 [main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main

14:53:00.856 [main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl

14:53:00.856 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.

14:53:00.857 [main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.

14:53:00.858 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'

 Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.

 NOT STARTED.

 Currently in standby mode.

 Number of jobs executed: 0

 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.

 Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.



14:53:00.858 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'

14:53:00.858 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0

14:53:00.859 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.

14:53:00.859 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.

14:53:00.859 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.

14:53:00.859 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutting down threadpool...

14:53:00.859 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Shutdown of threadpool complete.

14:53:00.859 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.

14:53:01.303 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.303 [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.304 [DefaultQuartzScheduler_Worker-6] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.304 [DefaultQuartzScheduler_Worker-5] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.305 [DefaultQuartzScheduler_Worker-9] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.323 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.338 [DefaultQuartzScheduler_Worker-7] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.338 [DefaultQuartzScheduler_Worker-8] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.338 [DefaultQuartzScheduler_Worker-4] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

14:53:01.338 [DefaultQuartzScheduler_Worker-10] DEBUG org.quartz.simpl.SimpleThreadPool - WorkerThread is shut down.

Scheduler的生命周期

從SchedulerFactory創建它時開始,到Scheduler調用shutdown()方法時結束;Scheduler被創建后,可以增加、刪除和列舉Job和Trigger,以及執行它的與調度相關的操作,但是,Scheduler只有在調用start()方法后,才會真正地觸發Trigger(即執行job)。

Job和Trigger的聯系

一個Job就是實現了Job接口的類,當Job的一個Trigger被觸發時,execute()方法由調用程序的一個工作線程調用,傳遞給execute()方法的JobExecutionContext對象向作業實例提供“運行時”環境,一個Job的Trigger被觸發后,execute()方法會被Scheduler的一個工作線程調用,傳遞給execute()方法的JobExecutionContext對象中保存著該Job運行時的一些信息。

Trigger是用于觸發Job執行的,當調度一個Job時,創建一個Trigger實例,設置調度相關的屬性,Quartz自帶了各種不同類型的Trigger,最常用的主要是SimpleTrigger和CronTrigger。

Job和Trigger的Key

將Job和Trigger注冊到Scheduler時,可以為它們設置key,配置其身份屬性,Job和Trigger的Key可以用于將Job和Trigger放到不同的分組里,然后基于分組進行操作。注意:同一個分組下的Job和Trigger的名稱必須唯一,即一個Job或Trigger的Key由名稱(name)和分組(group)組成。

問題:為什么既有Job又有Trigger呢?

很多任務調度器并不區分Job和Trigger,有些調度器只是簡單地通過一個執行時間和一些Job標識符來定義一個Job;其它的一些調度器將Quartz的Job和Trigger對象合二為一。Quartz的開發者認為將調度和要調度的任務分離是合理的,例如:Job被創建后,可以保存在Scheduler中,與Trigger是獨立的,同一個Job可以有多個Trigger,Job和Trigger之間是松耦合的,當與Scheduler中的Job關聯的Trigger都過期了,可以配置Job稍后被重新調度,而不是重新定義Job,還有,可以修改或者替換Trigger,而不用重新定義與之關聯的Job。

Job和JobDetail的聯系

JobDetail實例是通過JobBuilder類創建的,在Quartz的描述語言中,JobDetail被稱為“Job定義”或者“JobDetail實例”,一個正在執行的Job被稱為“Job實例”,所以,當我們使用“Job”時,一般指代的是Job定義,或者JobDetail;當我們提到實現Job接口的類時,通常使用“Job類”。

Job狀態與并發

Job的狀態數據和并發性,有一些地方需要注意,在Job類上可以加上一些注解來避免問題:

@DisallowConcurrentExecution:將該注解加到Job類上,告訴Quartz不要并發地執行同一個Job定義,需要注意:該注解雖然加在Job類上,但實際上是作用在JobDetail上的。

@PersistJobDataAfterExecution:將該注解加到Job類上,告訴Quartz在成功執行了job類的execute方法后(沒有發生任何異常),更新JobDetail中JobDataMap的數據,使得該Job(即JobDetail)在下一次執行的時候,JobDataMap中是更新后的數據,而不是更新前的舊數據。和 @DisallowConcurrentExecution注解一樣,該注解雖然加在Job類上,但實際上是作用在JobDetail上的。

如果你使用了@PersistJobDataAfterExecution注解,我們強烈建議你同時使用@DisallowConcurrentExecution注解,因為當同一個Job(JobDetail)的兩個實例被并發執行時,由于競爭,JobDataMap中存儲的數據很可能是不確定的。

JobDataMap

JobDataMap是Java Map接口的一個實現,可以包含不限量的(序列化的)數據對象,在Job實例執行的時候,可以使用其中的數據。

如果使用持久化的存儲機制,在決定JobDataMap中存放什么數據的時候需要小心,因為JobDataMap中存放的對象都會被序列化,因而可能會導致類的版本不一致的問題。

JobExecutionException

是execute方法中僅允許拋出一種類型的異常,在實際應用中,應該將execute方法中的所有內容都放到一個”try-catch”塊中,以便知道如何來處理發生的異常。

快速開始的完整示例

public class Quickstart {

   public static void main(String[] args) {
       try {
           Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
           scheduler.start();
           JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1")
                   .usingJobData("name", "quartz").build();
           Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow()
                   .withSchedule(simpleSchedule().withIntervalInSeconds(30).repeatForever()).build();

           scheduler.scheduleJob(job, trigger);
           try {
               Thread.sleep(1000L * 60L * 10L);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           scheduler.shutdown();
       } catch (SchedulerException e) {
           e.printStackTrace();
       }
   }
}

public class HelloJob implements Job {
   @Override
   public void execute(JobExecutionContext context) throws JobExecutionException {
       try {
           JobDetail job = context.getJobDetail();
           String name = job.getJobDataMap().getString("name");
           System.out.println("hello " + name + " at " + new Date());
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

關于Quartz是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女