首頁 > 軟體

Java使用quartz實現定時任務範例詳解

2022-08-09 22:00:44

正文

最近新到了一個專案,用到定時任務的地方是真滴多。

就稍微研究了一下,來做個demo。

其實定時任務使用很廣泛也很方便,之前做的人事管理專案,就會定期執行定時任務計算工資,對於一個saas服務來說,即時的計算所有員工的工資有點奢侈,所以在每週末計算一次就ok了。

國外有的公司是一週發一次工資,所以當時的邏輯是一週算一次。在國內就一月一次很ok了。在當時的report服務中,也是定時任務同步資料到Birt服務,然後展現資料。

現在的專案中使用的就更多了。把一些耗費效能的,資料即時性不強的都可以用定時任務在伺服器負載不高的時候進行計算。比如半夜計算商城使用者的積分,半夜計算銀行使用者行為產生的積分。銀行系統半夜計算罰息複利等。都是定時任務很好的應用例子。

下來我們舉一個列子來實現一個定時任務。

組態檔

sue.spring.quartz.cron=*/5 * * * * ?

pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

定時任務和觸發器

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;
    /**
     * 建立定時任務
     */
    @Bean
    public JobDetail quartzTestDetail() {
        JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class)
                //新增認證資訊
                .withIdentity("quartzTestDetail", "QUARTZ_TEST")
                .build();
        return jobDetail;
    }
    /**
     * 建立觸發器
     */
    @Bean
    public Trigger quartzTestJobTrigger() {
        //執行頻率
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron);
        //建立觸發器
        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(quartzTestDetail())
                //新增認證資訊
                .withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER")
                //新增執行規則
                .withSchedule(cronScheduleBuilder)
                .build();
        return trigger;
    }
}

定時任務的業務程式碼

這裡的QuartzTestJob如下,方法executeInternal裡就是需要定時執行的任務。

public class QuartzTestJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("現在是"+ new Date());
    }
}

當專案啟動起來之後,就會按照設定的頻率輸出如下:

當然也可以啟動定時任務查詢三方的返回結果,之前做車抵貸業務的風控系統的時候,請求了三方的資料,主動請求然後定時任務輪詢結果。

現在看來,用訊息佇列實現也是很每秒,延時訊息剛好可以滿足這個業務需求,請求資料然後向訊息佇列中放入一個延時訊息,時間到了,去請求結果,若是沒好,就再往訊息佇列中放入一個延時訊息。這樣相對於定時任務的好處是,避免了CPU空轉,提升了效能。

以上就是Java使用quartz實現定時任務範例詳解的詳細內容,更多關於Java quartz實現定時任務的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com