以Springboot為例介紹通過Quartz作業調度框架實現定時任務。
1、引用Quartz依賴
<!--引入Quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
2、實現具體的可執行的調度任務類,調度任務類需實現Quartz框架提供的Job接口。
@Override public void execute(JobExecutionContext jobExecutionContext) { //獲取JobDetail中的JobDataMap JobDataMap jobDetailMap = jobExecutionContext.getJobDetail().getJobDataMap(); for(Entry<String, Object> objectEntry: jobDetailMap.entrySet()){ System.out.println("jobDetailMap---"+objectEntry.getKey()+" "+objectEntry.getValue()); } //獲取trigger中的JobDataMap JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap(); for(Entry<String, Object> objectEntry: triggerMap.entrySet()){ System.out.println("triggerMap---"+objectEntry.getKey()+" "+objectEntry.getValue()); } //獲取trigger和JobDetail中的JobDataMap總和,如果有同一個key,則后者會將前者覆蓋 JobDataMap allMap = jobExecutionContext.getMergedJobDataMap(); for(Entry<String, Object> objectEntry: allMap.entrySet()){ System.out.println("allMap"+objectEntry.getKey()+" "+objectEntry.getValue()); } }
3、實現任務調度邏輯,使用@PostConstruct使此定時任務在項目啟動時即開始運行。
@PostConstruct public void buildQuartz(){ JobBuilder jobBuilder = JobBuilder.newJob(QuartzService.class).withIdentity(jobName,jobGroupName); jobBuilder.usingJobData("jobDetail參數","jobDetail值"); JobDetail jobDetail = jobBuilder.build(); /* * 按照指定間隔時間執行 * startNow()馬上執行 * withIntervalInSeconds(1) 按秒循環,1s循環一次 * repeatForever() 永遠循環 * */ Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName) .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever()) .build(); //表達式調度構建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ? *") .withMisfireHandlingInstructionDoNothing(); /* * 按照cron格式 定時執行 * */ Trigger triggerCron = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName) .startNow().withSchedule(scheduleBuilder).usingJobData("trigger參數","trigger值") .build(); SchedulerFactory stdSchedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = null; try { scheduler = stdSchedulerFactory.getScheduler(); scheduler.scheduleJob(jobDetail,triggerCron); scheduler.start(); } catch (SchedulerException e) { e.printStackTrace(); } }