1.任務
Job:是一個接口,只有一個方法void execute(JobExecutionContext context),開發者實現該接口定義運行任務,JobExecutionContext類提供了調度上下文的各種信息。Job運行時的信息保存在 JobDataMap實例中;
2.觸發器
Trigger:是一個類,描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和 CronTrigger這兩個子類。當僅需觸發一次或者以固定時間間隔周期執行,SimpleTrigger是最適合的選擇;而CronTrigger則 可以通過Cron表達式定義出各種復雜時間規則的調度方案:如每早晨9:00執行,周一、周三、周五下午5:00執行等;
3.調度器
JobDetail:Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接受一個Job的實例,相反它接收一個Job實現類,以便運行時通過newInstance()的反射機制實例化Job。因此需要通過一個類來描述Job的實現類及其它相關的靜態信息,如Job名字、描述、關聯監聽器等信息,JobDetail承擔了這一角色。
創建一個Quartz工作
1.計劃實體類
/** * *計劃實體類 */ public class Plan { private String date; private String task; public Plan(String date, String task) { this.date = date; this.task = task; } public Plan() { } @Override public String toString() { return "Plan [date=" + date + ", task=" + task + "]"; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getTask() { return task; } public void setTask(String task) { this.task = task; } }
2.提醒服務類
/** * * @提醒服務類 * */ public class RemindService { //數據查詢 public List<Plan> getPlansForToday(){ List<Plan> list=new ArrayList<Plan>(); Plan p1=new Plan("2016-11-3","呵呵"); Plan p2=new Plan("2016-11-4","嘿嘿"); list.add(p1); list.add(p2); return list; } //提醒服務類 public void ouputPlan(){ List<Plan> forToday = getPlansForToday(); for (Plan plan : forToday) { System.out.println("計劃時間"+plan.getDate()+"計劃內容"+plan.getTask()); } } }
3.提醒任務類
/** * * @提醒任務類 * */ public class RemindJob implements Job { private RemindService service=new RemindService(); public void execute(JobExecutionContext arg0) throws JobExecutionException { service.getPlansForToday(); } public RemindService getService() { return service; } public void setService(RemindService service) { this.service = service; } }
4.調度定時器任務
public class TestJob { public static void doRemind() throws SchedulerException, InterruptedException{ //創建一個任務 JobDetail job =JobBuilder.newJob(RemindJob.class).withIdentity("job1", "group1").build(); //創建一個觸發器 /*Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup")) .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMilliseconds(2)) .startAt(new Date(System.currentTimeMillis()+2000)) .build();*/ Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1"). withSchedule(CronScheduleBuilder.cronSchedule("0 34 16 ? * 5#1 2016")).build(); SchedulerFactory s=new StdSchedulerFactory(); Scheduler scheduler = s.getScheduler(); //注冊並進行調度 scheduler.scheduleJob(job,trigger); //啟動調度 scheduler.start(); //睡眠10s //Thread.sleep(10000); //關閉調度 //scheduler.shutdown(); } public static void main(String[] args) throws SchedulerException, InterruptedException { doRemind(); } }
Cron表達式