開源定時任務框架Quartz
Job和JobDetail
Job是Quartz中的一個介面,介面下只有execute方法,在這個方法中編寫業務邏輯。
該介面的源碼:
- package org.quartz;
- public interface Job {
- void execute(JobExecutionContext var1) throws JobExecutionException;
- }
每次調度執行Job時,調用execute方法前會創建一個新的Job實例,執行完後,關聯的Job對象實例會被釋放,隨後jvm執行GC。
JobDetail是用來綁定Job,為Job實例提供了許多屬性,以及JobDataMap成員變數屬性。調度器scheduler通過JobDetail對象來添加Job實例。
屬性:
1. name
2. group
3. jobClass
4. jobDataMap
JobExecutionContext
當調度器Scheduler調用一個Job時,就會將JobExecutionContext傳遞給Job的execute()方法,Job能通過JobExecutionContext對象訪問到Quartz運行時的環境以及Job本身的詳細數據信息。
代碼演示:
- public class HelloWorldJob implements Job {
- @Override
- public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
- String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
- System.out.println( strTime + ":Hello World!");
- System.out.println("JobDetail"name:" + jobExecutionContext.getJobDetail().getKey().getName());
- System.out.println("JobDetail"group:" + jobExecutionContext.getJobDetail().getKey().getGroup());
- System.out.println("JobDetail"class:" + jobExecutionContext.getJobDetail().getClass());
- }
- }
JobDataMap
任務調度時可以通過JobExecutionContext獲取JobDataMap,可以裝在任何可序列化的數據對象,JobDataMap實現了JDK的Map介面,可以以Key-Value的形式存儲數據。
實戰:JobDetail和Trigger傳遞數據,HelloWorldJob類execute三種方式獲取數據。
- //創建JobDetail實例,並與HelloWordlJob類綁定
- JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
- .usingJobData("key1","this is jobDetail")
- .build();
- //創建觸發器Trigger實例(立即執行,每隔1S執行一次)
- Trigger trigger = TriggerBuilder.newTrigger()
- .withIdentity("trigger1", "triggerGroup1")
- .usingJobData("key2", "this is trigger")
- .startNow()
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
- .build();
HelloWorldJob獲取數據:
- public class HelloWorldJob implements Job {
- private String key1;
- private String key2;
- public String getKey1() {
- return key1;
- }
- public void setKey1(String key1) {
- this.key1 = key1;
- }
- public String getKey2() {
- return key2;
- }
- public void setKey2(String key2) {
- this.key2 = key2;
- }
- @Override
- public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
- String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
- System.out.println( strTime + ":Hello World!");
- //獲取DataMap數據方法一
- System.out.println("JobDetail JobDataMap:" + jobExecutionContext.getJobDetail().getJobDataMap().get("key1"));
- System.out.println("Trigger JobDataMap:" + jobExecutionContext.getTrigger().getJobDataMap().get("key2"));
- //獲取DataMap數據方法二
- System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key1"));
- System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key2"));
- //獲取數據方法三
- System.out.println("通過成員變數獲取" + key1);
- System.out.println("通過成員變數獲取" + key2);
- }
- }
Trigger
Trigger是Quartz中的觸發器,任務執行時會通知調度器Scheduler何時出發,幾個重要的屬性。
1. Jobkey:表示job實例的標識
2. StartTime:表示觸發器首次被觸發的時間(Java.util.Date)。
3. EndTime:表示觸發器結束觸發的時間(Java.util.Date)
實戰:實現5S後執行,10S後結束,期間每隔1S執行一次定時任務
代碼演示:
MyScheduler類
- public class MyScheduler {
- public static void main(String[] args) throws SchedulerException {
- //創建調度器Schedule
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- Scheduler scheduler = schedulerFactory.getScheduler();
- //創建JobDetail實例,並與HelloWordlJob類綁定
- JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
- .build();
- //創建觸發器Trigger實例(5S後執行,10S後結束)
- //開始時間(5S後)
- Date date1 = new Date();
- date1.setTime(date1.getTime() + 5000);
- //結束時間(10S後)
- Date date2 = new Date();
- date2.setTime(date2.getTime() + 10000);
- Trigger trigger = TriggerBuilder.newTrigger()
- .withIdentity("trigger1", "triggerGroup1")
- .startAt(date1)
- .endAt(date2)
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
- .build();
- //開始執行
- scheduler.scheduleJob(jobDetail, trigger);
- scheduler.start();
- }
- }
SimpleTrigger
SimpleTrigger可以實現在一個指定時間段內執行一次作業任務或一個時間段內多次執行作業任務。
實戰:5S後開始執行,間隔時間為1S,第一次執行後連續執行3次
- package quartz2;
- import org.quartz.*;
- import org.quartz.impl.StdSchedulerFactory;
- import java.util.Date;
- /**
- * created by Java-Road
- * created in 2018/5/27
- */
- public class MyScheduler2 {
- public static void main(String[] args) throws SchedulerException {
- //創建調度器Schedule
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- Scheduler scheduler = schedulerFactory.getScheduler();
- //創建JobDetail實例,並與HelloWordlJob類綁定
- JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
- .build();
- //創建觸發器Trigger實例(5S後執行,一直執行)
- //開始時間(5S後)
- Date date1 = new Date();
- date1.setTime(date1.getTime() + 5000);
- SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
- .withIdentity("trigger1", "triggerGroup1")
- .startAt(date1)
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
- .withRepeatCount(3))
- .build();
- //開始執行
- scheduler.scheduleJob(jobDetail, trigger);
- scheduler.start();
- }
- }
CronTrigger
CronTrigger功能非常強大,是基於日曆的作業調度,而SimpleTrigger是精準指定間隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基於Cron表達式的,先了解下Cron表達式:
由7個子表達式組成字元串的,格式如下:
[秒] [分] [小時] [日] [月] [周] [年]
Cron表達式的語法就不多說了,因為我也記不住只能度娘,給大家提供個在線生成Cron表達式的工具:http://cron.qqe2.com/
實戰:實現每周一到周五上午10:30執行定時任務
- package quartz2;
- import org.quartz.*;
- import org.quartz.impl.StdSchedulerFactory;
- import java.util.Date;
- /**
- * created by Java-Road
- * created in 2018/5/27
- */
- public class MyScheduler3 {
- public static void main(String[] args) throws SchedulerException {
- //創建調度器Schedule
- SchedulerFactory schedulerFactory = new StdSchedulerFactory();
- Scheduler scheduler = schedulerFactory.getScheduler();
- //創建JobDetail實例,並與HelloWordlJob類綁定
- JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
- .build();
- //創建觸發器CronTrigger實例(每周一到周五10:30執行任務)
- CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
- .withIdentity("trigger1", "triggerGroup1")
- .startNow()
- .withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * MON-FRI *"))
- .build();
- //開始執行
- scheduler.scheduleJob(jobDetail, trigger);
- scheduler.start();
- }
- }
※使用Spark進行流式實時日誌分析系統的實現
※Webpack 入門
TAG:程序員小新人學習 |