1.Quartz示例
public class JobTest implements Job {
/**
* 具體執行的任務
*
* @param jobExecutionContext 保存着該job運行時的一些信息
*/
@Override
public void execute(JobExecutionContext jobExecutionContext) {
//執行job的scheduler的引用
Scheduler scheduler = jobExecutionContext.getScheduler();
//觸發job的trigger的引用
Trigger trigger = jobExecutionContext.getTrigger();
//JobDetail對象引用,以及一些其它信息
JobDetail jobDetail = jobExecutionContext.getJobDetail();
//獲取參數
//jobExecutionContext中的JobDataMap:他是JobDetail中的JobDataMap和Trigger中的JobDataMap的並集
JobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();
Object jobDetailValue = jobDataMap.get("jobDetailKey");
Object simpleTriggerValue = jobDataMap.get("simpleTriggerKey");
Object cronTriggerValue = jobDataMap.get("cronTriggerKey");
//任務執行詳情
String key = "jobDetailValue:" + jobDetailValue + " simpleTriggerValue:" + simpleTriggerValue + " cronTriggerValue:" + cronTriggerValue;
System.err.println(new Date() + ": doing something...獲取到的key:" + key);
}
}
class QuartzTest {
public static void main(String[] args) throws Exception {
//1、創建JobDetial對象
// 每次當scheduler執行job時,在調用其execute(…)方法之前會創建JobTest類的一個新的實例
JobDetail jobDetail = JobBuilder.newJob(JobTest.class)
//設置JobDetial的分組和名稱
.usingJobData("jobDetailKey", "jobDetailValue")
.withIdentity("job1", "group1")
.build();
//2、創建Trigger對象:SimpleTrigger
Trigger simpleTrigger = newTrigger()
//設置觸發器的分組和名稱
.withIdentity("simpleTrigger", "simpleTriggerGroup")
//開始時間
.startAt(new Date())
//結束時間
.endAt(new Date())
//設置優先級
.withPriority(1)
//設置參數
.usingJobData("simpleTriggerKey", "simpleTriggerValue")
.withSchedule(simpleSchedule()
//每隔一秒執行一次
.withIntervalInSeconds(1)
//一直執行
.repeatForever())
.build();
//創建Trigger對象:CronTrigger
CronTrigger cronTrigger = newTrigger()
.usingJobData("cronTriggerKey", "cronTriggerValue")
.withIdentity("cronTrigger", "cronTriggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
//設置優先級
.withPriority(1)
.build();
//3、創建調度器:Scheduler
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
//配置JobDetail和Trigger對象
scheduler.scheduleJob(jobDetail, cronTrigger);
//4、並執行啓動、關閉等操作
scheduler.start();
Thread.sleep(10000);
//關閉調度器:是否等待job執行完成才關閉
scheduler.shutdown(true);
System.err.println("-------關閉調度器-------");
}
}
2.Springboot集成quartz
2.1添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.2自動裝配介紹
我們可以再spingboot的自動裝配源碼可以看到quartz定義瞭如下的接口和類:
JobStoreType
該類是一個枚舉類型,定義了對應application.yml
、application.properties
文件內spring.quartz.job-store-type
配置,其目的是配置quartz
任務的數據存儲方式,分別爲:MEMORY(內存方式:默認
)、JDBC(數據庫方式)。QuartzAutoConfiguration
該類是自動配置的主類,內部配置了SchedulerFactoryBean
以及JdbcStoreTypeConfiguration
,使用QuartzProperties
作爲屬性自動化配置條件。QuartzDataSourceInitializer
該類主要用於數據源初始化後的一些操作,根據不同平臺類型的數據庫進行選擇不同的數據庫腳本。QuartzProperties
該類對應了spring.quartz
在application.yml
、application.properties
文件內開頭的相關配置。SchedulerFactoryBeanCustomizer
這是一個接口,我們實現該接口後並且將實現類使用Spring IOC
託管,可以完成SchedulerFactoryBean
的個性化設置,這裏的設置完全可以對SchedulerFactoryBean
做出全部的設置變更。
2.3繼承QuartzJobBean
繼承QuartzJobBean並重寫
executeInternal方法,與之前的實現
Job`接口類似
/**
* @Author smallmartial
* @Date 2020/4/19
* @Email [email protected]
*/
public class SampleJob extends QuartzJobBean {
//作業可以定義設置器以注入數據映射屬性。常規豆也可以類似的方式注入,如以下示例所示:
@Autowired
private TestService testService;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
testService.test();
System.out.println(" Hi! :" + jobExecutionContext.getJobDetail().getKey());
}
}
這裏TestService
打印一條uuid
模擬調用service的場景
2.4添加配置類
@Configuration
public class QuartzConfig {
@Bean
public JobDetail uploadTaskDetail() {
return JobBuilder.newJob(SampleJob.class).withIdentity("mjtTask").storeDurably().build();
}
@Bean
public Trigger uploadTaskTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?");
return TriggerBuilder.newTrigger().forJob(uploadTaskDetail())
.withIdentity("mjtTask")
.withSchedule(scheduleBuilder)
.build();
}
}