javascript
SpringBoot Quartz 定时任务详解
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/80657415
本文出自【趙彥軍的博客】
Quartz 簡介
在 JavaEE系統中,我們會經常用到定時任務,比如每天凌晨生成前天報表,每一小時生成匯總數據等等。
我們可以使用java.util.Timer結合java.util.TimerTask來完成這項工作,但時調度控制非常不方便,并且我們需要大量的代碼。
使用Quartz框架無疑是非常好的選擇,并且與Spring可以非常方便的集成,下面介紹它們集成方法和Cron表達式的詳細介紹。
Quartz 集成
官網:http://www.quartz-scheduler.org/
依賴:
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency>實例1
創建 Job
package com.yiba.didiapi.job;import org.quartz.*;import java.util.Date;public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("任務執行了: ");JobDataMap dataMap = context.getMergedJobDataMap();String name = dataMap.getString("name"); //獲取名字Integer age = dataMap.getInt("age"); //獲取年齡System.out.println("name: " + name + " age:" + age);JobDetail jobDetail = context.getJobDetail();String jobName = jobDetail.getKey().getName();String jobGroup = jobDetail.getKey().getGroup();System.out.println("jobName: " + jobName + " jobGroup:" + jobGroup);Trigger trigger = context.getTrigger();String triggerName = trigger.getKey().getName();String triggerGroup = trigger.getKey().getGroup();Date startTime = trigger.getStartTime(); //獲取任務開始時間Date endTime = trigger.getEndTime(); //獲取任務結束時間System.out.println("triggerName: " + triggerName + " triggerGroup:" + triggerGroup);} }創建 JobScheduler
package com.yiba.didiapi.job;import org.quartz.*; import org.quartz.impl.StdSchedulerFactory;import java.util.Date;public class JobScheduler {public static void main(String[] args) {JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("jobName", "jobGroup") //定義job的名字和組.usingJobData("name", "yanjun") //傳參數,key:name value:yanjun.usingJobData("age", 18) //傳參數,key:age value:18.build();//定義開始時間Date startDate = new Date();//定義結束時間,在開始時間之后10秒Date endDate = new Date(startDate.getTime() + 10 * 1000);//觸發器 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroup").startNow() //現在開始執行.startAt(startDate) //在指定的時間開始執行.endAt(endDate) //在指定的時間結束執行.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever() //永遠執行下去.withRepeatCount(10) //執行10次.withIntervalInSeconds(1) //一秒鐘執行一次).build();try {SchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();scheduler.scheduleJob(jobDetail,trigger);scheduler.start(); //開始執行} catch (SchedulerException e) {e.printStackTrace();}} }CronTrigger
Quartz有兩大觸發器,除了上面使用的SimpleTrigger外,就是CronTrigger。CronTrigger能夠提供復雜的觸發器表達式的支持。CronTrigger是基于Unix Cron守護進程,它是一個調度程序,支持簡單而強大的觸發器語法。
使用CronTrigger主要的是要掌握Cron表達式。Cron表達式包含6個必要組件和一個可選組件,如下表所示。
Cron 表達式是由 7個子表達式組成的字符串,描述了時間表的詳細信息。
格式:[秒] [分] [小時] [日] [月] [周] [年]
| 1 | 秒(0~59) | , - * / |
| 2 | 分(0~59) | , - * / |
| 3 | 小時(0~23) | , - * / |
| 4 | 日期(1~31) | , - * / ? L W C |
| 5 | 月(JAN~DEC或1~12) | , - * / |
| 6 | 星期(SUN~SAT或1~7) | , - * / ? L C # |
| 7 | 年(可選,1970~2099),若為空,表示全部時間范圍 | , - * / |
特殊字符的含義,見下表
| * | 通配符,任意值 |
| ? | 無特定值。通常和其他指定的值一起使用,表示必須顯示該值但不能檢查 |
| - | 范圍。e.g.小時部分10-12表示10:00,11:00, 12:00 |
| , | 列分隔符。可以讓你指定一系列的值。e.g.在星期域中指定MON、TUE和WED |
| / | 增量。表示一個值的增量,e.g.分鐘域中0/1表示從0開始,每次增加1min |
| L | 表示Last。它在日期和星期域中表示有所不同。在日期域中,表示這個月的最后一天,而在星期域中,它永遠是7(星期六)。當你希望使用星期中某一天時,L字符非常有用。e.g.星期域中6L表示每一個月的最后一個星期五 |
| W | 在本月內離當天最近的工作日觸發,所謂的最近工作日,即當天到工作日的前后最短距離,如果當天即為工作日,則距離是0;所謂本月內指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天確實滿足最近工作日。e.g. LW表示本月的最后一個工作日觸發,W強烈依賴月份。 |
| # | 表示該月的第幾個星期,e.g. 1#2表示每一個月的第一個星期一 |
| C | 日歷值。日期值是根據一個給定的日歷計算出來的。在日期域中給定一個20C將在20日(日歷包括20日)或20日后日歷中包含的第一天(不包括20日)激活觸發器。例如在一個星期域中使用6C表示日歷中星期五(日歷包括星期五)或者第一天(日歷不包括星期五) |
常見的Cron表達式舉例
"30 * * * * ?" //每半分鐘觸發任務 "30 10 * * * ?" //每小時的10分30秒觸發任務 "30 10 1 * * ?" //每天1點10分30秒觸發任務 "30 10 1 20 * ?" //每月20號1點10分30秒觸發任務 "30 10 1 20 10 ? *" //每年10月20號1點10分30秒觸發任務 "30 10 1 20 10 ? 2011" //2011年10月20號1點10分30秒觸發任務 "30 10 1 ? 10 * 2011" //2011年10月每天1點10分30秒觸發任務 "30 10 1 ? 10 SUN 2011" //2011年10月每周日1點10分30秒觸發任務 "15,30,45 * * * * ?" //每15秒,30秒,45秒時觸發任務 "15-45 * * * * ?" //15到45秒內,每秒都觸發任務 "15/5 * * * * ?" //每分鐘的每15秒開始觸發,每隔5秒觸發一次 "15-30/5 * * * * ?" //每分鐘的15秒到30秒之間開始觸發,每隔5秒觸發一次 "0 0/3 * * * ?" //每小時的第0分0秒開始,每三分鐘觸發一次 "0 15 10 ? * MON-FRI" //星期一到星期五的10點15分0秒觸發任務 "0 15 10 L * ?" //每個月最后一天的10點15分0秒觸發任務 "0 15 10 LW * ?" //每個月最后一個工作日的10點15分0秒觸發任務 "0 15 10 ? * 5L" //每個月最后一個星期四的10點15分0秒觸發任務 "0 15 10 ? * 5#3" //每個月第三周的星期四的10點15分0秒觸發任務CronTrigger 實例
package com.yiba.didiapi.job;import org.quartz.*; import org.quartz.impl.StdSchedulerFactory;public class JobScheduler {public static void main(String[] args) {JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("jobName", "jobGroup") //定義job的名字和組.usingJobData("name", "yanjun") //傳參數,key:name value:yanjun.usingJobData("age", 18) //傳參數,key:age value:18.build();String cronExpression = "0/1 * * * * ?"; //每一秒執行一次CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroup").withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();try {SchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();scheduler.scheduleJob(jobDetail,trigger);scheduler.start(); //開始執行} catch (SchedulerException e) {e.printStackTrace();}}}Scheduler
//創建一個 Scheduler SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler();//給調度器設置 job,trigger scheduler.scheduleJob(jobDetail,trigger); scheduler.start(); //開始執行scheduler.standby(); //調度器掛起,掛起后可以通過 start 重啟//立即關閉調度器,關閉后,不能重啟 scheduler.shutdown() ; //true:等待所有的job都執行完,然后再關閉scheduler //false:立即關閉scheduler scheduler.shutdown(true); scheduler.isShutdown(); //是否關閉了 scheduler.isStarted(); //是否啟動了 scheduler.isInStandbyMode() ; //是否掛起了個人微信號:zhaoyanjun125 , 歡迎關注
總結
以上是生活随笔為你收集整理的SpringBoot Quartz 定时任务详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos 7 查看内存占用情况相关命
- 下一篇: SpringBoot AOP完全讲解一: