最近公司的業務須要用到定時任務,框架選型用的是 Quartz ,這裏做學習記錄。框架
Quartz 的核心由三大接口組成,分別是 Job,Trigger,Scheduleride
描述執行具體的任務,其結構與 Runnable 相似,只有一個 void 類型的方法 execute(JobExecutionContext context),它還有一個子類 InterruptableJob,表示一個可終止的任務學習
在 Job 的基礎只添加了一個 void 類型的方法 interrupt() ,用於終止任務,它的調用發生在在 QuartzScheduler#shutdown(boolean) 中,這要求咱們須要像編寫一個可終止的的 Runnable 同樣編寫 execute 方法。ui
用來描述一個 Job 的 execute 方法什麼時候執行spa
相似隊列與線程池,存放各類 Job 的信息與 Trigger ,管理任務的添加,移除,替換,運行等線程
Scheduler:做爲一個管理任務的容器,Scheduler 應該有相似線程池的提交任務與關閉池的方法:對應的添加任務方法分別爲 addJob, scheduleJob,很不巧這些方法的簽名是 JobDetail;code
JobDetail:JobDetail 有一個實現類 JobDetailImpl ,而且空構造器表示必須指定 name,class,group。class 是指 Job 接口的實現;group 是可選的,默認使用 default;blog
Trigger:Trigger 有多個實現類,這裏只涉及到基本實現 SimpleTriggerImpl;接口
上述的三個接口都有對應的建造類或者工廠類。隊列
1 /** 2 * @author pancc 3 * @version 1.0 4 */ 5 public class SimpleJobDemo { 6 public static void main(String[] args) throws SchedulerException, InterruptedException { 7 JobDetail detail = JobBuilder.newJob(SimpleJob.class) 8 .withIdentity("simple", "group0") 9 .build(); 10 11 Trigger trigger = TriggerBuilder.newTrigger() 12 .withIdentity("simple_trigger") 13 .startNow() 14 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) 15 .build(); 16 17 Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 18 19 scheduler.start(); 20 scheduler.scheduleJob(detail, trigger); 21 /* 22 * 10 秒鐘後關閉 23 */ 24 Thread.sleep(10_000); 25 scheduler.shutdown(); 26 } 27 28 public static class SimpleJob implements Job { 29 @Override 30 public void execute(JobExecutionContext context) { 31 System.out.printf("now date: %s", new Date()); 32 } 33 } 34 35 }
上邊的代碼建立了一個任務打印當前任務,而且指定它的運行開始時間爲提交的時候,而且週期爲2秒,持續永久。10 秒鐘後關閉容器。
必要的屬性:JobDetail 必須有描述名,組在未設定時使用 default。
可訪問性:在通常的代碼中,咱們習慣性限制類的訪問,好比上邊的 SimpleJob 咱們可能會定義 private(意味着它的構造器也是 private 的),這在 Quartz 中是不被容許的。Job 的空構造器必須是 pubilc 的,這與後續 Quartz 的特性有關。