
(2)有了任務后,還需要一個能夠實現觸發任務去執行的觸發器,觸發器Traigger最基本的功能是指定job的執行時間,執行間隔,運行次數等
二、Quartz Demo搭建
下面來利用Quartz搭建一個最基本的Demo。
1、導入依賴的jar包:
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
2.配置信息
# 名為:quartz.properties,放置在classpath下,如果沒有此配置則按默認配置啟動 # 指定調度器名稱,非實現類 org.quartz.scheduler.instanceName = DefaultQuartzScheduler04 # 指定線程池實現類 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool # 線程池線程數量 org.quartz.threadPool.threadCount = 10 # 優先級,默認5 org.quartz.threadPool.threadPriority = 5 # 非持久化job org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
3、新建一個能夠打印任意內容的Job:
public class PrintWordsJob implements Job{ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date()); System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100)); } }
4、創建Schedule,執行任務:
public class MyScheduler { public static void main(String[] args) throws SchedulerException, InterruptedException { // 1、創建調度器Scheduler SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); // 2、創建JobDetail實例,並與PrintWordsJob類綁定(Job執行內容) JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class) .withIdentity("job1", "group1").build(); // 3、構建Trigger實例,每隔1s執行一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1") .startNow()//立即生效 .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(1)//每隔1s執行一次 .repeatForever()).build();//一直執行 //4、執行 scheduler.scheduleJob(jobDetail, trigger); System.out.println("--------scheduler start ! ------------"); scheduler.start(); //睡眠 TimeUnit.MINUTES.sleep(1); scheduler.shutdown(); System.out.println("--------scheduler shutdown ! ------------"); } }
運行程序,可以看到程序每隔1s會打印出內容,且在一分鍾后結束:
三、Quartz核心詳解
下面就程序中出現的幾個參數,看一下Quartz框架中的幾個重要參數:
- Job和JobDetail
- JobExecutionContext
- JobDataMap
- Trigger、SimpleTrigger、CronTrigger
2.JobExecutionContext
JobExecutionContext中包含了Quartz運行時的環境以及Job本身的詳細數據信息。
當Schedule調度執行一個Job的時候,就會將JobExecutionContext傳遞給該Job的execute()中,Job就可以通過JobExecutionContext對象獲取信息。
3.JobDataMap
JobDataMap實現了JDK的Map接口,可以以Key-Value的形式存儲數據。
JobDetail、Trigger都可以使用JobDataMap來設置一些參數或信息,
Job執行execute()方法的時候,JobExecutionContext可以獲取到JobExecutionContext中的信息:
4.Trigger、SimpleTrigger、CronTrigger
[秒] [分] [小時] [日] [月] [周] [年]
下面的代碼就實現了每周一到周五上午15:00執行定時任務
public class MyScheduler2 { public static void main(String[] args) throws SchedulerException { //創建調度器Scheduler SchedulerFactory schedulerFactory=new StdSchedulerFactory(); Scheduler scheduler=schedulerFactory.getScheduler(); //創建jobDetail實例,並與printWordsJob類綁定(job執行內容) JobDetail jobDetail= JobBuilder.newJob(PrintWordsJob.class).usingJobData("jobDetail1","這個job用來測試的") .withIdentity("job1","group1").build(); //構建Trigger實例,每隔一秒執行一次 //實現程序運行5s后開始執行Job,執行Job 5s后結束執行: Date startDate=new Date(); startDate.setTime(startDate.getTime()+5000); Date endDate=new Date(); endDate.setTime(startDate.getTime()+5000); CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1") .usingJobData("trigger1", "這是jobDetail1的trigger") .startNow() .startAt(startDate) .endAt(endDate) .withSchedule(CronScheduleBuilder.cronSchedule("* 00 15 ? * 1/5 2019")).build(); scheduler.scheduleJob(jobDetail,cronTrigger); System.out.println("--------scheduler start ! ------------"); scheduler.start(); System.out.println("--------scheduler shutdown ! ------------"); } }
原文鏈接:https://blog.csdn.net/noaman_wgs/article/details/80984873