SprinBoot整合Quart實現(xiàn)定時調(diào)度的示例代碼
Quartz是一款開源的定時任務(wù)調(diào)度框架,Quartz的官網(wǎng)是:http://www.quartz-scheduler.org/。本文主要是講訴使用springboot整合quartz實現(xiàn)定時任務(wù)調(diào)度管理的用例。主要的內(nèi)容有如下三部分:
1. springboot整合quartz的相關(guān)配置
2. 實現(xiàn)基于simpleTrigger的定時任務(wù)
3. 實現(xiàn)基于cronTrigger的定時任務(wù)
一、導(dǎo)入相關(guān)的pom依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bruce.quartz.springboot.demo</groupId> <artifactId>Quartz-SpringBoot-0426</artifactId> <version>1.0-SNAPSHOT</version> <!--導(dǎo)入SpringBoot--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--Quartz任務(wù)調(diào)度的包 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
二、創(chuàng)建SpringBoot的啟動類
package com.anhong;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
/**
* @BelongsProject: Quartz-SpringBoot-0426
* @BelongsPackage: com.anhong
* @Author: anhong
* @CreateTime: 2020-10-24 09:24
* @Description: TODO
*/
@SpringBootApplication
public class APP {
public static void main(String[] args) {
SpringApplication.run(APP.class,args);
}
/**
* 向Spring容器中初始注入scheduler
*/
@Bean
public Scheduler scheduler() throws SchedulerException {
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
三、創(chuàng)建quartz的作業(yè)類
package com.anhong.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @BelongsProject: Quartz-SpringBoot-0426
* @BelongsPackage: com.anhong.job
* @Author: anhong
* @CreateTime: 2020-10-24 09:35
* @Description: 任務(wù)類,實現(xiàn)JOB接口,重寫其中的方法
*/
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=simpleDateFormat.format(new Date());
System.out.println("各位老鐵,早上好!節(jié)日快樂?。?+time);
}
}
四、創(chuàng)建quartz的配置類
package com.anhong.config;
import com.anhong.bean.TaskInfo;
import com.bruce.job.MyJob;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* @BelongsProject: Quartz-SpringBoot-0426
* @BelongsPackage: com.anhong.config
* @Author: anhong
* @CreateTime: 2020-10-24 10:10
* @Description: Quartz配置類
*/
@SpringBootConfiguration
public class QuartzConfig {
//任務(wù)調(diào)度器
@Autowired
private Scheduler scheduler;
/**
* 01-開啟任務(wù)
*/
public void startJob(){
try {
openJob(scheduler);
//啟動任務(wù)
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 02-暫停某個任務(wù)
*/
public void pauseJob(String name,String group) throws Exception{
//任務(wù)的標(biāo)識類
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail!=null){
//暫停某個任務(wù)
scheduler.pauseJob(jobKey);
}else{
System.out.println("該任務(wù)不存在!");
}
}
/**
* 03-查詢所有的任務(wù)基本信息
* @return
*/
public List<TaskInfo> getAllJobsInfo() throws Exception{
List<TaskInfo> list=new ArrayList<TaskInfo>();
//所有任務(wù)組
List<String> jobGroupNames = scheduler.getJobGroupNames();
for (String jobGroupName : jobGroupNames) {
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.<JobKey>groupEquals(jobGroupName));
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
String cronExpression=""; //cron表達(dá)式
String cronDescription=""; //描述信息
if(trigger instanceof CronTrigger){
CronTrigger cronTrigger=(CronTrigger)trigger;
//cron表達(dá)式
cronExpression = cronTrigger.getCronExpression();
cronDescription=cronTrigger.getDescription();
}
TaskInfo taskInfo=new TaskInfo();
taskInfo.setJobName(jobKey.getName());
taskInfo.setJobGroup(jobKey.getGroup());
taskInfo.setJobDescrption(jobDetail.getDescription());
taskInfo.setStatus(triggerState.name()); //任務(wù)的狀態(tài)
taskInfo.setCronExpression(cronExpression);
taskInfo.setCronDescription(cronDescription);
list.add(taskInfo);
}
}
}
return list;
}
/**
* 開啟一個任務(wù)
* @param scheduler
*/
private void openJob(Scheduler scheduler){
try {
//1.創(chuàng)建一個JobDetail
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
//2.觸發(fā)器表達(dá)式對象
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/4 * * * * ?");
//CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("30 25 16 * * ?");
//3.準(zhǔn)備一個觸發(fā)器對象
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggergroup1")
.withSchedule(cronScheduleBuilder).build();
//4.開始調(diào)度
scheduler.scheduleJob(jobDetail,cronTrigger);
} catch (SchedulerException e) {
e.printStackTrace();
} finally {
}
}
/**
* 04-恢復(fù)某個任務(wù)的執(zhí)行
* @param name
* @param group
*/
public void resumeJob(String name,String group) throws Exception{
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail!=null){
scheduler.resumeJob(jobKey);
}else{
System.out.println("要恢復(fù)的任務(wù)不存在!");
}
}
/**
* 05-刪除某一個任務(wù)
* @param name
* @param group
* @throws Exception
*/
public void deleteJob(String name,String group) throws Exception{
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail!=null){
scheduler.deleteJob(jobKey);
}else{
System.out.println("要刪除的任務(wù)不存在!");
}
}
/**
* 06-動態(tài)的修改任務(wù)執(zhí)行的表達(dá)式,觸發(fā)規(guī)則
* @param name
* @param group
* @return
*/
public boolean modifyJob(String name,String group,String newTime) throws Exception{
Date date=null;
TriggerKey triggerKey=new TriggerKey(name,group);
Trigger trigger = scheduler.getTrigger(triggerKey);
CronTrigger cronTrigger=null;
if(trigger instanceof CronTrigger){
cronTrigger=(CronTrigger)trigger;
//表達(dá)式
String cronExpression = cronTrigger.getCronExpression();
if(!cronExpression.equalsIgnoreCase(newTime)){
System.out.println("需要修改原來的表達(dá)式:"+cronExpression+"為:"+newTime);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(newTime);
//新的觸發(fā)器
CronTrigger cronTrigger1 = TriggerBuilder.newTrigger().withIdentity(name, group).withSchedule(cronScheduleBuilder).build();
date = scheduler.rescheduleJob(triggerKey, cronTrigger1);
}else{
System.out.println("不用修改!和原來的一樣!");
}
}
if(date!=null){
return true;
}else{
return false;
}
}
}
任務(wù)對象
package com.anhong.bean;
/**
* @BelongsProject: Quartz-SpringBoot-0426
* @BelongsPackage: com.anhong.bean
* @Author: anhong
* @CreateTime: 2020-10-24 10:24
* @Description: 任務(wù)對象
*/
public class TaskInfo {
private String jobName;
private String jobGroup;
private String jobDescrption;
private String status;
private String cronExpression;
private String cronDescription;
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobGroup() {
return jobGroup;
}
public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}
public String getJobDescrption() {
return jobDescrption;
}
public void setJobDescrption(String jobDescrption) {
this.jobDescrption = jobDescrption;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public String getCronDescription() {
return cronDescription;
}
public void setCronDescription(String cronDescription) {
this.cronDescription = cronDescription;
}
}
五、創(chuàng)建Quartz的監(jiān)聽類
package com.anhong;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
@Configuration
public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private QuartzScheduler quartzScheduler;
/**
* 初始啟動quartz
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
quartzScheduler.startJob();
System.out.println("任務(wù)已經(jīng)啟動...");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 初始注入scheduler
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException{
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
六、創(chuàng)建控制器
package com.anhong.controller;
import com.anhong.bean.TaskInfo;
import com.anhong.config.QuartzConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @BelongsProject: Quartz-SpringBoot-0426
* @BelongsPackage: com.anhong.controller
* @Author: anhong
* @CreateTime: 2020-10-24 10:43
* @Description: TODO
*/
@RestController
@RequestMapping("/quartz")
public class QuartzController {
@Autowired
QuartzConfig quartzConfig;
/**
* 01-開啟一個定時任務(wù)
*
* @return
*/
@RequestMapping("/start")
public String startQuartzJob() {
try {
quartzConfig.startJob();
} catch (Exception e) {
e.printStackTrace();
return "定時任務(wù)開啟異常~~~";
}
return "定時任務(wù)開啟成功~~~";
}
/**
* 02-暫停任務(wù)
*
* @param name
* @param group
* @return
*/
@RequestMapping("/pauseJob")
public String pauseJob(String name, String group) {
try {
quartzConfig.pauseJob(name, group);
} catch (Exception e) {
e.printStackTrace();
return name + "任務(wù)暫停異常";
} finally {
}
return name + "任務(wù)被暫停";
}
/**
* 03-查詢所有的任務(wù)基本信息
*
* @return
*/
@RequestMapping("/infos")
public List<TaskInfo> getAllJobsInfo() {
try {
return quartzConfig.getAllJobsInfo();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 04-恢復(fù)某個任務(wù)的執(zhí)行
*
* @param name
* @param group
*/
@RequestMapping("/resumeJob")
public String resumeJob(String name, String group) {
try {
quartzConfig.resumeJob(name, group);
} catch (Exception e) {
e.printStackTrace();
return name + "任務(wù)被恢復(fù)異常!";
} finally {
}
return name + "任務(wù)被恢復(fù)啦!";
}
/**
* 05-刪除某一個任務(wù)
*
* @param name
* @param group
* @throws Exception
*/
@RequestMapping("/deleteJob")
public String deleteJob(String name, String group) {
try {
quartzConfig.deleteJob(name, group);
} catch (Exception e) {
e.printStackTrace();
return name + "任務(wù)刪除異常!";
} finally {
}
return name + "任務(wù)被刪除啦!";
}
/**
* 06-動態(tài)的修改任務(wù)執(zhí)行的表達(dá)式,觸發(fā)規(guī)則
*
* @param name
* @param group
* @return
*/
@RequestMapping("/modifyJob")
public String modifyJob(String name, String group, String newTime) {
boolean flag = false;
try {
flag = quartzConfig.modifyJob(name, group, newTime);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
if (flag) {
return name + "任務(wù)時間表達(dá)式修改為:" + newTime;
} else {
return name + "任務(wù)時間表達(dá)式失敗!";
}
}
}
總結(jié):SpringBoot整合Quertz實現(xiàn)定時調(diào)度的大致步驟實現(xiàn)就如上,在很多微服務(wù)商城項目上都會用到定時調(diào)度,在根據(jù)實際的項目業(yè)務(wù)需要,我們只需要把以上的一些配置做適當(dāng)?shù)男薷膩頋M足自己業(yè)務(wù)的需要。
到此這篇關(guān)于SprinBoot整合Quart實現(xiàn)定時調(diào)度的示例代碼的文章就介紹到這了,更多相關(guān)SprinBoot整合Quart內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中的File文件類以及FileDescriptor文件描述類
在Java中File類可以用來新建文件和目錄對象,而FileDescriptor類則被用來表示文件或目錄的可操作性,接下來我們就來詳解Java中的File文件類以及FileDescriptor文件描述類2016-06-06
Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式
這篇文章主要介紹了Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式,設(shè)計模式的建立有利于團隊協(xié)作時代碼的共同維護,需要的朋友可以參考下2016-01-01
Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法
本文主要介紹了Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Dubbo?retries?超時重試機制的問題原因分析及解決方案
這篇文章主要介紹了Dubbo?retries?超時重試機制的問題,解決方案是通過修改dubbo服務(wù)提供方,將timeout超時設(shè)為20000ms或者設(shè)置retries=“0”,禁用超時重試機制,感興趣的朋友跟隨小編一起看看吧2022-04-04

