Quartz入門例子簡介 從入門到菜鳥(二)
阿新 • • 發佈:2019-02-11
本節補充一些SimpleTrigger的API使用,文章一次性寫的太長會大大降低可閱讀性,所以還是少食多餐吧。
順大便回顧一下Quartz的基本使用方法,聯絡windows自帶的計劃任務,假想場景如下:
下面先對MyJob做個小改動,讓我們定義的任務Key打印出來。
Java程式碼
接下來這個小例子是QuartzMultiJobTest.java,是個多工例子,比如說,我想讓我的任務五秒鐘後執行,並且開始執行之後,隔三秒鐘再執行一次,再隔三秒鐘再執行一次,實現如下,注意@NOTICE標記:
Java程式碼
主要需要理解的是
1.DateBuilder.nextGivenSecondDate這個方法的執行時間
2.同一個任務可以多次註冊
3.重複執行需要在Trigger的設定裡面加入SimpleScheduleBuilder,設定重複次數和重複時間即可。repeatForever()方法永遠表示一直重複執行。
4.有三個API用法沒放到例子中:
a.scheduler.addJob(job, true); //無trigger註冊,表示任務立即執行。
b.scheduler.rescheduleJob(trigger.getKey(), trigger); //在scheduler.start之後呼叫,可以在job開始後重新定義trigger,然後重新註冊。
c.scheduler.getMetaData().getNumberOfJobsExecuted() 可以在shutdown後取出執行的任務數量,一些基本資訊封裝在SchedulerMetaData物件中。
這節比較簡單。
順大便回顧一下Quartz的基本使用方法,聯絡windows自帶的計劃任務,假想場景如下:
- 1.我要讓電腦查殺病毒(對應Quartz: 實現Job介面的execute方法,後期通過反射例項化JobDetail物件)。
- 2.我想讓電腦在五分鐘之後做查殺病毒這個job(對應Quartz:通過TriggerBuilder來new出一個時間為五分鐘之後的Trigger)。
- 3.把上面我想象到的時間:五分鐘之後;任務:查殺病毒 放到windows的定時任務當中,點選確定(對應Quartz:通過SchedulerFactory拿到Scheduler
下面先對MyJob做個小改動,讓我們定義的任務Key打印出來。
Java程式碼
- public class MyJob implements Job {
- @Override
- public void execute(JobExecutionContext context) throws JobExecutionException {
-
// @NOTICE JobExecutionContext 是任務執行的上下文,可以拿到任務的Key
- String jobName = context.getJobDetail().getKey().getName();
- System.out.println("任務Key:" + jobName + " 正在執行,執行時間: " + Calendar.getInstance().getTime());
- }
- }
接下來這個小例子是QuartzMultiJobTest.java,是個多工例子,比如說,我想讓我的任務五秒鐘後執行,並且開始執行之後,隔三秒鐘再執行一次,再隔三秒鐘再執行一次,實現如下,注意@NOTICE標記:
Java程式碼
- public class QuartzMultiJobTest {
- public static void main(String[] args) throws Throwable {
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
- // @NOTICE 任務的開始時間,nextGivenSecondDate方法表示:當前時間之後,每當秒數是13的倍數都是觸發時間,當然只觸發一次
- // 比如:00:00:12秒開始主執行緒,則13秒就會觸發任務,如果00:00:14秒開始主執行緒,則在26秒觸發任務
- Date runTime = DateBuilder.nextGivenSecondDate(null, 13);
- JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
- scheduler.scheduleJob(job, trigger);
- // @NOTICE 將同一個Job實現作為另外一個任務註冊到scheduler,注意名字要區分
- job = JobBuilder.newJob(MyJob.class).withIdentity("job2", "group1").build();
- trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").startAt(runTime).build();
- scheduler.scheduleJob(job, trigger);
- // @NOTICE 重複執行,job3表示第一次執行完之後,每隔3秒鐘執行一次,重複5次,withRepeatCount引數不包括第一次執行那次,即job3總共執行6次
- job = JobBuilder.newJob(MyJob.class).withIdentity("job3", "group1").build();
- trigger = TriggerBuilder.newTrigger().withIdentity("trigger3", "group1")
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(5).withIntervalInSeconds(3)).startAt(runTime).build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- try {
- // 等待20秒
- Thread.sleep(20L * 1000L);
- } catch (Exception e) {
- }
- scheduler.shutdown(true);
- }
- }
主要需要理解的是
1.DateBuilder.nextGivenSecondDate這個方法的執行時間
2.同一個任務可以多次註冊
3.重複執行需要在Trigger的設定裡面加入SimpleScheduleBuilder,設定重複次數和重複時間即可。repeatForever()方法永遠表示一直重複執行。
4.有三個API用法沒放到例子中:
a.scheduler.addJob(job, true); //無trigger註冊,表示任務立即執行。
b.scheduler.rescheduleJob(trigger.getKey(), trigger); //在scheduler.start之後呼叫,可以在job開始後重新定義trigger,然後重新註冊。
c.scheduler.getMetaData().getNumberOfJobsExecuted() 可以在shutdown後取出執行的任務數量,一些基本資訊封裝在SchedulerMetaData物件中。
這節比較簡單。