Java使用quartz實(shí)現(xiàn)定時(shí)任務(wù)示例詳解
正文
最近新到了一個(gè)項(xiàng)目,用到定時(shí)任務(wù)的地方是真滴多。
就稍微研究了一下,來做個(gè)demo。
其實(shí)定時(shí)任務(wù)使用很廣泛也很方便,之前做的人事管理項(xiàng)目,就會定期執(zhí)行定時(shí)任務(wù)計(jì)算工資,對于一個(gè)saas服務(wù)來說,即時(shí)的計(jì)算所有員工的工資有點(diǎn)奢侈,所以在每周末計(jì)算一次就ok了。
國外有的公司是一周發(fā)一次工資,所以當(dāng)時(shí)的邏輯是一周算一次。在國內(nèi)就一月一次很ok了。在當(dāng)時(shí)的report服務(wù)中,也是定時(shí)任務(wù)同步數(shù)據(jù)到Birt服務(wù),然后展現(xiàn)數(shù)據(jù)。
現(xiàn)在的項(xiàng)目中使用的就更多了。把一些耗費(fèi)性能的,數(shù)據(jù)即時(shí)性不強(qiáng)的都可以用定時(shí)任務(wù)在服務(wù)器負(fù)載不高的時(shí)候進(jìn)行計(jì)算。比如半夜計(jì)算商城用戶的積分,半夜計(jì)算銀行用戶行為產(chǎn)生的積分。銀行系統(tǒng)半夜計(jì)算罰息復(fù)利等。都是定時(shí)任務(wù)很好的應(yīng)用例子。
下來我們舉一個(gè)列子來實(shí)現(xiàn)一個(gè)定時(shí)任務(wù)。
配置文件
sue.spring.quartz.cron=*/5 * * * * ?
pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
定時(shí)任務(wù)和觸發(fā)器
package com.luke.demo.schedule; import org.quartz.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { @Value("${sue.spring.quartz.cron}") private String testCron; /** * 創(chuàng)建定時(shí)任務(wù) */ @Bean public JobDetail quartzTestDetail() { JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class) //添加認(rèn)證信息 .withIdentity("quartzTestDetail", "QUARTZ_TEST") .build(); return jobDetail; } /** * 創(chuàng)建觸發(fā)器 */ @Bean public Trigger quartzTestJobTrigger() { //執(zhí)行頻率 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron); //創(chuàng)建觸發(fā)器 Trigger trigger = TriggerBuilder.newTrigger() .forJob(quartzTestDetail()) //添加認(rèn)證信息 .withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER") //添加執(zhí)行規(guī)則 .withSchedule(cronScheduleBuilder) .build(); return trigger; } }
定時(shí)任務(wù)的業(yè)務(wù)代碼
這里的QuartzTestJob如下,方法executeInternal里就是需要定時(shí)執(zhí)行的任務(wù)。
public class QuartzTestJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("現(xiàn)在是"+ new Date()); } }
當(dāng)項(xiàng)目啟動起來之后,就會按照設(shè)定的頻率輸出如下:
當(dāng)然也可以啟動定時(shí)任務(wù)查詢?nèi)降姆祷亟Y(jié)果,之前做車抵貸業(yè)務(wù)的風(fēng)控系統(tǒng)的時(shí)候,請求了三方的數(shù)據(jù),主動請求然后定時(shí)任務(wù)輪詢結(jié)果。
現(xiàn)在看來,用消息隊(duì)列實(shí)現(xiàn)也是很每秒,延時(shí)消息剛好可以滿足這個(gè)業(yè)務(wù)需求,請求數(shù)據(jù)然后向消息隊(duì)列中放入一個(gè)延時(shí)消息,時(shí)間到了,去請求結(jié)果,若是沒好,就再往消息隊(duì)列中放入一個(gè)延時(shí)消息。這樣相對于定時(shí)任務(wù)的好處是,避免了CPU空轉(zhuǎn),提升了性能。
以上就是Java使用quartz實(shí)現(xiàn)定時(shí)任務(wù)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java quartz實(shí)現(xiàn)定時(shí)任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java?@Scheduled定時(shí)任務(wù)不執(zhí)行解決辦法
- Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)
- Java實(shí)現(xiàn)定時(shí)任務(wù)最簡單的3種方法
- Java項(xiàng)目實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
- Java使用線程池執(zhí)行定時(shí)任務(wù)
- Java中定時(shí)任務(wù)的6種實(shí)現(xiàn)方式
- Java spring定時(shí)任務(wù)詳解
- Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)
- Java定時(shí)任務(wù)取消的示例代碼
相關(guān)文章
Java NegativeArraySizeException異常解決方案
這篇文章主要介紹了Java NegativeArraySizeException異常解決方案,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08SpringBoot實(shí)現(xiàn)RAS+AES自動接口解密
本文主要介紹了SpringBoot實(shí)現(xiàn)RAS+AES自動接口解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03淺談idea中導(dǎo)入maven項(xiàng)目的兩種方式
本文主要介紹了淺談idea中導(dǎo)入maven項(xiàng)目的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08SpringBoot+JWT實(shí)現(xiàn)注冊、登錄、狀態(tài)續(xù)簽流程分析
這篇文章主要介紹了SpringBoot+JWT實(shí)現(xiàn)注冊、登錄、狀態(tài)續(xù)簽【登錄保持】,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06