Spring Boot 配置 Quartz 定時任務(wù)的方法
Quartz有四個核心概念:
Job:是一個接口,只定義一個方法 execute(JobExecutionContext context),在實(shí)現(xiàn)接口的 execute 方法中編寫所需要定時執(zhí)行的 Job(任務(wù))
Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
JobDetail:Quartz 每次調(diào)度 Job 時,都重新創(chuàng)建一個 Job 實(shí)例,因此它不接受一個 Job 的實(shí)例,相反它接收一個 Job 實(shí)現(xiàn)類(JobDetail,描述 Job 的實(shí)現(xiàn)類及其他相關(guān)的靜態(tài)信息,如 Job 名字、描述、關(guān)聯(lián)監(jiān)聽器等信息),以便運(yùn)行時通過 newInstance() 的反射機(jī)制實(shí)例化 Job。
rigger:是一個類,描述觸發(fā) Job 執(zhí)行的時間觸發(fā)規(guī)則,主要有 SimpleTrigger 和 CronTrigger 這兩個子類。當(dāng)且僅當(dāng)需調(diào)度一次或者以固定時間間隔周期執(zhí)行調(diào)度,SimpleTrigger 是最適合的選擇;而 CronTrigger 則可以通過 Cron 表達(dá)式定義出各種復(fù)雜時間規(guī)則的調(diào)度方案:如工作日周一到周五的 15:00 ~ 16:00 執(zhí)行調(diào)度等。
Scheduler:調(diào)度器就相當(dāng)于一個容器,裝載著任務(wù)和觸發(fā)器,該類是一個接口,代表一個 Quartz 的獨(dú)立運(yùn)行容器,Trigger 和 JobDetail 可以注冊到 Scheduler 中,兩者在 Scheduler 中擁有各自的組及名稱,組及名稱是 Scheduler 查找定位容器中某一對象的依據(jù),Trigger 的組及名稱必須唯一,JobDetail 的組和名稱也必須唯一(但可以和 Trigger 的組和名稱相同,因?yàn)樗鼈兪遣煌愋偷模?。Scheduler 定義了多個接口方法,允許外部通過組及名稱訪問和控制容器中 Trigger 和 JobDetail。
1.導(dǎo)入pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.開啟定時任務(wù)
@EnableScheduling注解
//java fhadmin.cn
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3.新建一個job
@Slf4j
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
executeTask(jobExecutionContext);
} catch (Exception e) {
e.printStackTrace();
}
}
//java fhadmin.cn
private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException {
//JobExecutionContext 類提供了調(diào)度應(yīng)用的一些信息;
//Job 運(yùn)行時的信息保存在 JobDataMap 實(shí)例中。
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println(new Date()+"->"+key.toString()+"定時任務(wù)正在執(zhí)行");
}
}
4.構(gòu)建JobDetailrigger
把Trigger 和 JobDetail 可以注冊到 Scheduler 中
//fhrom fhadmin.cn
@Configuration
public class QuartzManager {
// public static final String JOB1="job1";
// public static final String GROUP1="group1";
/**默認(rèn)每個星期凌晨一點(diǎn)執(zhí)行*/
//public static final String DEFAULT_CRON="0 0 1 ? * L";
/**默認(rèn)5秒執(zhí)行一次*/
// public static final String DEFAULT_CRON="*/5 * * * * ?";
/**
* 任務(wù)調(diào)度
*/
private Scheduler scheduler;
@Bean
public Scheduler scheduler() throws SchedulerException {
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
this.scheduler = schedulerFactoryBean.getScheduler();
return schedulerFactoryBean.getScheduler();
}
/**
* 開始執(zhí)行定時任務(wù)
*/
public void startJob(String name,String group,String time) throws SchedulerException {
startJobTask(scheduler,name,group,time);
scheduler.start();
}
/**
* 啟動定時任務(wù)
* @param scheduler
*/
private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException {
//對于身份
JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(name,group).build();
System.out.println("jobDetail:-------------"+jobDetail);
String DEFAULT_CRON="*/"+time+" * * * * ?";
// SimpleScheduleBuilder CronScheduleBuilder 用于構(gòu)建Scheduler,定義任務(wù)調(diào)度的時間規(guī)則
CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON);
//觸發(fā)器
CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group)
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
/**
* 獲取Job信息
* @param name
* @param group
*/
public String getjobInfo(String name,String group) throws SchedulerException {
TriggerKey triggerKey=new TriggerKey(name,group);
System.out.println("triggerKey:"+triggerKey);
CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),
scheduler.getTriggerState(triggerKey).name());
}
/**
* 修改任務(wù)的執(zhí)行時間
* @param name
* @param group
* @param cron cron表達(dá)式
* @return
* @throws SchedulerException
*/
public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
Date date=null;
TriggerKey triggerKey=new TriggerKey(name, group);
CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime=cronTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)){
CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
.withSchedule(cronScheduleBuilder).build();
date=scheduler.rescheduleJob(triggerKey,trigger);
}
return date !=null;
}
/**
* 暫停所有任務(wù)
* @throws SchedulerException
*/
public void pauseAllJob()throws SchedulerException{
scheduler.pauseAll();
}
/**
* 暫停某個任務(wù)
* @param name
* @param group
* @throws SchedulerException
*/
public void pauseJob(String name,String group)throws SchedulerException{
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null) {
return;
}
scheduler.pauseJob(jobKey);
}
/**
* 恢復(fù)所有任務(wù)
* @throws SchedulerException
*/
public void resumeAllJob()throws SchedulerException{
scheduler.resumeAll();
}
/**
* 恢復(fù)某個任務(wù)
*/
public void resumeJob(String name,String group)throws SchedulerException {
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null) {
return;
}
scheduler.resumeJob(jobKey);
}
/**
* 刪除某個任務(wù)
* @param name
* @param group
* @throws SchedulerException
*/
public void deleteJob(String name,String group)throws SchedulerException{
JobKey jobKey=new JobKey(name, group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null) {
return;
}
scheduler.deleteJob(jobKey);
}
}
5.編寫Controller
通過調(diào)用接口 可以開始定時任務(wù) 結(jié)束定時任務(wù) 獲取任務(wù)信息
//fhadmin.cn
@RestController
@RequestMapping("/quartz")
public class ModifyCronController {
@Autowired
private QuartzManager quartzManager;
@GetMapping("/modify")
public String modify(@RequestParam("job")String job, //job的名稱
@RequestParam("group")String group,//job的組
@RequestParam("time")String time //執(zhí)行定時任務(wù)的步長
) throws SchedulerException {
// quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1);
quartzManager.startJob(job,group,time);
String s = quartzManager.getjobInfo(job, group);
System.out.println("job:"+s);
return "ok";
}
}
到此這篇關(guān)于Spring Boot 配置 Quartz 定時任務(wù)的文章就介紹到這了,更多相關(guān)Spring Boot Quartz 定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot異步調(diào)用@Async過程詳解
這篇文章主要介紹了Spring Boot異步調(diào)用@Async過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題
這篇文章主要介紹了springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(55)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08
Java異常處理之java.lang.ClassCastException問題
這篇文章主要介紹了Java異常處理之java.lang.ClassCastException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Java并發(fā)工具之CyclicBarrier使用詳解
這篇文章主要介紹了Java并發(fā)工具之CyclicBarrier使用詳解,CyclicBarrier是一個同步器,允許一組線程相互之間等待,直到到達(dá)某個公共屏障點(diǎn)(common barrier point),再繼續(xù)執(zhí)行,需要的朋友可以參考下2023-12-12
Springboot-Management的項(xiàng)目實(shí)踐
本文主要介紹了Springboot-Management的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

