日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot Quartz 定时任务详解

發布時間:2024/9/30 javascript 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 定时任务详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。