超神理解:SpringBoot 處理定時任務

項目經常會用到定時任務,springboot 自然是可以通過整合相關組件來實現的。

目前常用的定時任務的實現有兩種:

本次借用上一篇《spring boot 整合 Mybatis》的既有項目結構進行案例調試。

一、cron 表達式

無論上面說的哪種實現方式,都需要用到 cron 表達式,因此不得不先介紹下它。

Cron 表達式是一個字符串,由 6 或 7 個域組成,每個域有不同的含義,每個域之間用空格隔開。有 2 中格式:

Seconds Minutes Hours DayofMonth Month DayofWeek Year (7 個域)
Seconds Minutes Hours DayofMonth Month DayofWeek (6 個域)

每個域可能出現的值:

除了以上內容外,還可能出現一些特殊字符:

舉例:

以上看上去有點複雜,不過不用擔心,記住常用的就行了。另外,現在網上還有 在線 Cron 表達式生成器可以幫助我們設定確定相關表達式內容。

二、@Schedule 實現

  1. 引入依賴

  1. 代碼實現

a、新建類 JdkSchedule

裏面的 userService 爲上一次添加的內容

b、啓動類添加註解,啓動定時任務

  1. 測試效果

每隔兩秒打印一次:

三、Quartz 實現

1.Quartz 介紹

Quartz 是一個完全由 Java 編寫的開源任務調度的框架,通過觸發器設置作業定時運行規則,控制作業的運行時間。它包括調度器、觸發器、作業。

ltKkLx

  1. 基本使用

a、引入依賴

b、創建 job 類

publicclass MyJob implements Job {
    @Override 
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("...quartz job 觸發執行...");
    }
}

需要實現 Quartz 的 Job 接口

c、編寫測試類:

/**
* quartz 原生態用法
 */
public class JobTestMain {
    public static void main(String[] args) throws SchedulerException {
        //1. 創建 job
	JobDetail job = JobBuilder.newJob(MyJob.class).build();
        //2. 創建 trigger  
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?"))
                .build();
        //3. 創建 schedule 
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

d、執行測試類 JobTestMain:

每三秒打印一次:

3.springboot 整合使用

a、引入依賴

<!-- 添加 schedule 依賴 -->
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context-support</artifactId>
</dependency>
<!-- 引入 quartz 依賴 -->
<dependency>
 <groupId>org.quartz-scheduler</groupId>
 <artifactId>quartz</artifactId>
</dependency>
<!-- 引入 spring tx 依賴 -->
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-tx</artifactId>
</dependency>

springboot 整合的時候,需要添加這三個依賴。

編寫配置類

/**
* springboot 整合 quartz 使用方法 
*/
@Configuration
public class QuartzConfig {
	/**
	* 創建 job 對象
	* @return
	*/
	@Bean
	public JobDetailFactoryBean jobDetailFactoryBean() {
	       JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
	       jobDetailFactoryBean.setJobClass(MyJob.class);
	       return jobDetailFactoryBean;
	}
	/**
	* 創建 trigger 對象 - cron 表達式對象     
	* @param jobDetailFactoryBean     
	* @return     
	*/ 
	@Bean 
	public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
	        CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
	        cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?");
	        // 關聯 JobDetail 對象 cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
	        return cronTriggerFactoryBean;
	}    
	/**     
	* 創建 trigger 對象 - 一般對象     
	* @param jobDetailFactoryBean     
	* @return     
	*/ 
	@Bean 
	public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
	        SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean();
	        // 關聯 JobDetail 對象 
		simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject());
	        // 設置重複次數, 這裏配置的是重複次數,而不是總次數;總次數 = 重複次數 + 1,也就是說這裏配置的次數是:執行完一次之後,再重複執行的次數 
		simpleTriggerFactoryBean.setRepeatCount(1);
	        // 設置間隔時間 
		simpleTriggerFactoryBean.setRepeatInterval(2000);
	        return simpleTriggerFactoryBean;
	}    
	/**
	* 創建 schedule 對象     
	* @param triggerFactoryBean     
	* @return     
	*/ 
	@Bean 
	public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){
	        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
	        schedulerFactoryBean.setTriggers(triggerFactoryBean.getObject());
	        return schedulerFactoryBean;
	}
}

這裏需要注意下,schedulerFactoryBean() 方法中傳入的參數如果是 CronTriggerFactoryBean, 則執行的是 cronTriggerFactoryBean() 對應的設置;參數如果是 SimpleTriggerFactoryBean, 則執行的是 simpleTriggerFactoryBean() 對應的設置。

啓動類添加註解

    

測試效果

每 5 秒鐘執行一次:

如果前面的 @Schedule 和這裏的 Quartz 的定時任務放在一起了,則執行效果爲兩個 Job 一起執行:

...quartz job 觸發執行... 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
** 觸發 JDK 定時器 *** 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
** 觸發 JDK 定時器 *** 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
** 觸發 JDK 定時器 *** 
...quartz job 觸發執行... 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
** 觸發 JDK 定時器 *** 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
** 觸發 JDK 定時器 *** 
User{id=1, name='sam', age=32} 
User{id=2, name='hah', age=10} 
...quartz job 觸發執行...

以上即爲本文全部內容。

來源: https://www.toutiao.com/a7005166040321753614/?log_from=9c33004fc8254_1631498345246

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RnMmq7h3UU9CfCHGD5Jpkw