- 1、分部解釋
- 2、整體代碼
前言:
1、定時任務技術:
- JDK 的 Timer, 定義多個定時任務,其中某個任務出現異常,當時整個定時任務終止。
- Spring Task , 不支持 持久化與分布式部署,所有任務是單線程執行的
- Quartz,支持持久化多線程執行。
2、Spring Boot 整合Quartz
- Job: 任務。定時執行的具體任務內容
- JobDetail: 任務詳情。即與任務相關的其他配置信息
- Trigger: 觸發器,主要負責描述任務執行的時間規則
- Scheduler: 調度器。
- 將Job和Trigger整合起來之間的關系: Job:JobDetail->1:N JobDetail:Trigger->1:N Trigger:JobDetail->1:1
3、引入pom文件:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
4、創建執行任務,Job (自己的定時任務)
對應代碼:
@Slf4j
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class MyJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("任務開始執行");JobDetail jobDetail = context.getJobDetail();System.out.println("名字" + jobDetail.getKey().getName());System.out.println("類名--->" + jobDetail.getJobClass().getName());System.out.println("本次執行的時間為---》" + context.getFireTime());System.out.println("下次執行的時間為---》" + context.getNextFireTime());System.out.println("任務執行完畢");System.out.println("============================");}
}
5、創建JobDtail 和 Trigger
在執行任務的類上添加注解。
- PersistJobDataAfterExecution ,有狀態的,在定時任務執行的Job中獲取的JobExecutionContext 是同一個。比如在JobDetail 中,usingJobData(“count”,1);進行共享數據的初始化,如果不使用這個注解在執行任務上,會獲取不同的JobExecutionContext 。
- DisallowConcurrentExecution 在時間間隔內,如果本任務沒有執行完成,下一個任務不會啟動,一直到本任務結束。下一個任務才開始執行。
創建配置類:
解釋:
持久化 .storeDurably() 。如果沒有持久化,沒有對應的觸發器,失去執行的條件,存在沒有意義,就會將其刪除。
如果有持久化,沒有對應的觸發器,還是會保留 JobDetail。
對應代碼:
@Configuration
public class QuartzConfiguration {//JobDetail@Bean(value = "jobDetail")public JobDetail jobDetail(){return JobBuilder.newJob(MyJob.class).storeDurably()//唯一標識.withIdentity("jobDetail").build();}@Bean// @Qualifier 引用指定的bean 的實例對象。public Trigger trigger(@Qualifier("jobDetail")JobDetail jobDetail){Trigger jobDetail1 = TriggerBuilder.newTrigger().forJob(jobDetail)//唯一標識和上面的JobDetail是配對的。.withIdentity("jobDetail")//這個表達式可以寫到yml 中進行引用,這樣以后更改直接改配置文件即可。//每兩秒鐘執行一次.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();return jobDetail1;}}
6、cron表達式
tips:一般使用 六位,最后一位年 一般不使用。
整體代碼實例演示:
pom文件
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
1、自己的定時任務Job
@Slf4j
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class MyJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("任務開始執行");JobDetail jobDetail = context.getJobDetail();System.out.println("名字" + jobDetail.getKey().getName());System.out.println("類名--->" + jobDetail.getJobClass().getName());System.out.println("本次執行的時間為---》" + context.getFireTime());System.out.println("下次執行的時間為---》" + context.getNextFireTime());System.out.println("任務執行完畢");System.out.println("============================");}
}
2、定時任務的配置類
@Configuration
public class QuartzConfiguration {//JobDetail@Bean(value = "jobDetail")public JobDetail jobDetail(){return JobBuilder.newJob(MyJob.class).storeDurably()//唯一標識.withIdentity("jobDetail").build();}@Bean//Triggerpublic Trigger trigger(@Qualifier("jobDetail")JobDetail jobDetail){Trigger jobDetail1 = TriggerBuilder.newTrigger().forJob(jobDetail)//唯一標識和上面的JobDetail是配對的。.withIdentity("jobDetail")//這個表達式可以寫到yml 中進行引用,這樣以后更改直接改配置文件即可。//每兩秒鐘執行一次.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();return jobDetail1;}}