首先在開篇前,先放一個Springboot簡單使用定時器的文章:
那當然還有一篇稍微進階點的,動态排程:
現在這篇是比較傳統一點的,手動配置的方式:
定時任務配置包括 :
jobDetail 任務執行個體 定時任務執行的具體内容等 -相關業務代碼
trigger 觸發器 設定相關的運作周期等 -綁定任務執行個體 (這篇文章會介紹包括兩種觸發器,簡單的以及設定cron的)
scheduler 排程器 決定哪些定時任務會執行 -綁定觸發器
OK,接下來我們開始。
首先是導入Quartz定時器會用到的相關依賴包:
<!-- scheduled所屬資源為spring-context-support,在Spring中對Quartz的支援,是內建在spring-context-support包中。
org.springframework.scheduling.quartz
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- Quartz坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<!-- Quartz預設需要slf4j支援。springboot中,提供了更高版本的slf4j -->
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
然後看下我們這次的實踐裡整體需要弄得幾個檔案:
建立第一個定時任務的執行個體,TaskJobOne.class : (注意這裡的@EnableScheduling 别忘記了)
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.lang.Thread.sleep;
/**
* @Author : JCccc
* @CreateTime : 2020/3/9
* @Description :
**/
@Component
@EnableScheduling
public class TaskJobOne {
public void testJobOneMethod() throws InterruptedException {
System.out.println("1 定時任務1正在執行......"+new Date());
sleep(1000);
System.out.println("1 定時任務1業務代碼執行完畢......"+new Date());
}
}
然後是建立多個,也就是第二個定時任務的執行個體,TaskJobTwo.class: (注意這裡的@EnableScheduling 别忘記了)
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.lang.Thread.sleep;
/**
* @Author : JCccc
* @CreateTime : 2020/3/9
* @Description :
**/
@Component
@EnableScheduling
public class TaskJobTwo {
public void testJobTwoMethod() throws InterruptedException {
System.out.println("2 定時任務2正在執行......" + new Date());
sleep(1000);
System.out.println("2 定時任務2業務代碼執行完畢......"+new Date());
}
}
然後是給這些任務執行個體綁定觸發器,然後将觸發器加入到排程工廠裡:
建立 QuartzConfiguration.class:
(注意看每一步的注釋,或者看後面我的簡要要點描述!)
import com.demo.elegant.quartz.taskOne.TaskJobOne;
import com.demo.elegant.quartz.taskTwo.TaskJobTwo;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import java.util.Date;
/**
* @Author : JCccc
* @CreateTime : 2020/3/9
* @Description :
**/
@Configuration
public class QuartzConfiguration {
/*
定時任務配置包括 :
jobDetail 任務執行個體
定時任務執行的具體内容等 -相關業務代碼
trigger 觸發器
設定相關的運作周期等 -綁定任務執行個體
scheduler 排程器
決定哪些定時任務會執行 -綁定觸發器
*/
/**
* 定時任務 1
*/
// 配置定時任務1的任務執行個體
@Bean(name = "firstJobDetail")
public MethodInvokingJobDetailFactoryBean firstJobDetail(TaskJobOne taskJobOne) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否并發執行
jobDetail.setConcurrent(false);
// 為需要執行的實體類對應的對象
jobDetail.setTargetObject(taskJobOne);
// 需要執行的方法
jobDetail.setTargetMethod("testJobOneMethod");
return jobDetail;
}
// 配置觸發器1
@Bean(name = "firstTrigger")
public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
trigger.setJobDetail(firstJobDetail);
// 設定任務啟動延遲
trigger.setStartDelay(0);
// 設定定時任務啟動時間
trigger.setStartTime(new Date());
// 每5秒執行一次
trigger.setRepeatInterval(5000);
return trigger;
}
/**
* 定時任務 2
*
* @param taskJobTwo
* @return
*/
// 配置定時任務2的任務執行個體
@Bean(name = "secondJobDetail")
public MethodInvokingJobDetailFactoryBean secondJobDetail(TaskJobTwo taskJobTwo) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
// 是否并發執行
jobDetail.setConcurrent(true);
// 為需要執行的實體類對應的對象
jobDetail.setTargetObject(taskJobTwo);
// 需要執行的方法
jobDetail.setTargetMethod("testJobTwoMethod");
return jobDetail;
}
// 配置觸發器2
@Bean(name = "secondTrigger")
public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(secondJobDetail);
// 設定定時任務啟動時間
trigger.setStartTime(new Date());
// cron表達式
trigger.setCronExpression("*/7 * * * * ?");
return trigger;
}
// 配置Scheduler
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 延時啟動,應用啟動1秒後
bean.setStartupDelay(1);
// 注冊觸發器
bean.setTriggers(firstTrigger, secondTrigger);
return bean;
}
}
要點描述1:
将我們的執行個體配置成為定時任務執行個體
要點描述2:
綁定觸發器 簡單觸發器:
要點描述3:
綁定可以使用cron表達式的觸發器,這次實踐裡面我們的任務2就是:
要點描述4:
将配置好的觸發器加入排程工廠:
運作一下,可以看到2個定時任務都正常運作: