springboot動(dòng)態(tài)定時(shí)任務(wù)的實(shí)現(xiàn)方法示例
1、maven引入quartz包
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
2、創(chuàng)建定時(shí)任務(wù)工廠類
/**
* 定時(shí)任務(wù)工廠類
*/
@Component
public class JobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
private transient AutowireCapableBeanFactory beanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
final Object jobInstance = super.createJobInstance(bundle);
beanFactory.autowireBean(jobInstance);
return jobInstance;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.beanFactory = applicationContext.getAutowireCapableBeanFactory();
}
}
3、創(chuàng)建定時(shí)任務(wù)抽象類
public abstract class AbstractTask implements Job {
private Logger logger = LoggerFactory.getLogger(AbstractTask.class);
protected abstract void executeInternal(JobExecutionContext context) throws Exception;
/**
* 定時(shí)任務(wù)標(biāo)識(shí)
*/
private String key;
/**
* 數(shù)據(jù)庫里配置的主鍵id
*/
private Long dataBaseId;
@Override
public void execute(JobExecutionContext context) {
try {
executeInternal(context);
} catch (Exception e) {
logger.error(e.getMessage(), e);
logger.error("job execute failed!");
}
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Long getDataBaseId() {
return dataBaseId;
}
public void setDataBaseId(Long dataBaseId) {
this.dataBaseId = dataBaseId;
}
}
4、創(chuàng)建定時(shí)任務(wù)業(yè)務(wù)實(shí)現(xiàn)類
這里可以寫你的業(yè)務(wù)代碼,實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。
@Component("JobTask")
public class JobTask extends AbstractTask {
@Override
protected void executeInternal(JobExecutionContext context) {
System.out.println("key = " + this.getKey());
System.out.println("dataBaseId = " + this.getDataBaseId());
}
}
5、創(chuàng)建定時(shí)任務(wù)管理器
包括項(xiàng)目啟動(dòng)時(shí)添加定時(shí)任務(wù),手動(dòng)添加定時(shí)任務(wù),更新定時(shí)任務(wù),刪除定時(shí)任務(wù)方法。
/**
* 定時(shí)任務(wù)管理容器 component (單例模式)
*/
@Component
@Scope("singleton")
public class JobQuartzManager implements ApplicationContextAware {
/**
* 創(chuàng)建新的scheduler
*/
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
private Scheduler scheduler;
/**
* 定義組名稱,不同的組用于區(qū)分任務(wù)
*/
private static final String JOB_GROUP_NAME = "JOB_GROUP_NAME";
private static final String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME";
/**
* 日志
*/
private Logger logger = LoggerFactory.getLogger(JobQuartzManager.class);
private ApplicationContext applicationContext;
@Autowired
private JobFactory jobFactory;
public void start() {
//啟動(dòng)定時(shí)任務(wù)(初始化)
try {
this.scheduler = schedulerFactory.getScheduler();
scheduler.setJobFactory(jobFactory); //設(shè)置定時(shí)任務(wù)工廠模式
//項(xiàng)目啟動(dòng)時(shí)默認(rèn)給spring容器添加動(dòng)態(tài)的定時(shí)任務(wù)
this.addJob("job" + 100L, 100L, JobTask.class, "0/2 * * * * ?");
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
throw new RuntimeException("init Scheduler failed");
}
}
public boolean addJob(String jobName, Long dataBaseId, Class jobClass, String cronExp) {
boolean result = false;
if (!CronExpression.isValidExpression(cronExp)) {
logger.error("Illegal cron expression format({})", cronExp);
return result;
}
try {
JobDetail jobDetail = JobBuilder.newJob().withIdentity(new JobKey(jobName, JOB_GROUP_NAME))
.ofType((Class<AbstractTask>) Class.forName(jobClass.getName()))
.build();
//創(chuàng)建完jobDetail之后,使用語句傳參數(shù)值,方便定時(shí)任務(wù)內(nèi)部識(shí)別它是什么標(biāo)識(shí)
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("key", jobName);
jobDataMap.put("dataBaseId", dataBaseId);
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
.withIdentity(new TriggerKey(jobName, TRIGGER_GROUP_NAME))
.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
result = true;
} catch (Exception e) {
logger.error(e.getMessage(), e);
logger.error("QuartzManager add job failed");
}
return result;
}
public boolean updateJob(String jobName, String cronExp) {
boolean result = false;
if (!CronExpression.isValidExpression(cronExp)) {
logger.error("Illegal cron expression format({})", cronExp);
return result;
}
JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);
TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);
try {
if (scheduler.checkExists(jobKey) && scheduler.checkExists(triggerKey)) {
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
Trigger newTrigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExp))
.withIdentity(new TriggerKey(jobName, TRIGGER_GROUP_NAME))
.build();
scheduler.rescheduleJob(triggerKey, newTrigger);
result = true;
} else {
logger.error("update job name:{},group name:{} or trigger name:{},group name:{} not exists..",
jobKey.getName(), jobKey.getGroup(), triggerKey.getName(), triggerKey.getGroup());
}
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
logger.error("update job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
}
return result;
}
public boolean deleteJob(String jobName) {
boolean result = false;
JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);
try {
if (scheduler.checkExists(jobKey)) {
result = scheduler.deleteJob(jobKey);
} else {
logger.error("delete job name:{},group name:{} not exists.", jobKey.getName(), jobKey.getGroup());
}
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
logger.error("delete job name:{},group name:{} failed!", jobKey.getName(), jobKey.getGroup());
}
return result;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
6、創(chuàng)建定時(shí)任務(wù)啟動(dòng)類
項(xiàng)目運(yùn)行時(shí)給spring注入定時(shí)任務(wù)
/**
* 定時(shí)任務(wù)啟動(dòng)類
*/
@Component
public class JobRunner implements ApplicationRunner {
//注入定時(shí)任務(wù)管理器
@Autowired
private JobQuartzManager quartzManager;
/**
* 項(xiàng)目啟動(dòng)時(shí)激活定時(shí)任務(wù)
*/
@Override
public void run(ApplicationArguments applicationArguments) {
System.out.println("--------------------注入定時(shí)任務(wù)---------------------");
quartzManager.start();
System.out.println("--------------------定時(shí)任務(wù)注入完成---------------------");
}
}
7、測(cè)試案例
@RestController
@RequestMapping("/job")
public class JobController {
@Autowired
JobQuartzManager quartzManager;
@PostMapping("addJob")
@ResponseBody
public String addJob(@RequestParam("dataBaseId") Long dataBaseId, @RequestParam("cronExp") String cronExp){
boolean success = quartzManager.addJob("job" + dataBaseId, dataBaseId, JobTask.class, cronExp);
if(success){
return "添加成功";
}else{
return "添加失敗!";
}
}
@PostMapping("deleteJob")
@ResponseBody
public String deleteJob(@RequestParam("jobName") String jobName){
boolean success = quartzManager.deleteJob(jobName);
if(success){
return "刪除成功";
}else{
return "刪除失??!";
}
}
@PostMapping("updateJob")
@ResponseBody
public String updateJob(@RequestParam("jobName") String jobName, @RequestParam("cronExp") String cronExp){
boolean success = quartzManager.updateJob(jobName, cronExp);
if(success){
return "更新成功";
}else{
return "更新失敗!";
}
}
}
總結(jié)
到此這篇關(guān)于springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)springboot動(dòng)態(tài)定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法詳解
- SpringBoot?實(shí)現(xiàn)動(dòng)態(tài)添加定時(shí)任務(wù)功能
- Springboot自帶定時(shí)任務(wù)實(shí)現(xiàn)動(dòng)態(tài)配置Cron參數(shù)方式
- SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線程并發(fā)定時(shí)任務(wù)
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
- Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)流程詳解
相關(guān)文章
mybatis3.4.6 批量更新 foreach 遍歷map 的正確姿勢(shì)詳解
這篇文章主要介紹了mybatis3.4.6 批量更新 foreach 遍歷map 的正確姿勢(shì)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼
下面小編就為大家分享一篇java公眾平臺(tái)通用接口工具類HttpConnectUtil實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
spring?boot項(xiàng)目自定義參數(shù)校驗(yàn)規(guī)則示例詳解
這篇文章主要介紹了spring boot項(xiàng)目如何自定義參數(shù)校驗(yàn)規(guī)則,自定義校驗(yàn)規(guī)則和自帶的規(guī)則實(shí)現(xiàn)方式一樣,先自定義一個(gè)注解,然后指定校驗(yàn)類,在校驗(yàn)類里實(shí)現(xiàn)具體的校驗(yàn)規(guī)則,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Java Springboot 重要知識(shí)點(diǎn)整理匯總
Spring Boot作為微服務(wù)中最好的Java框架,本文主要為大家整理匯總了七個(gè)Spring Boot的重要知識(shí)點(diǎn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法,第一種是實(shí)體類自己實(shí)現(xiàn)比較,第二種是借助比較器進(jìn)行排序,下面開一起看看詳細(xì)的介紹吧,有需要的朋友們可以參考借鑒。2016-12-12
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之在線服裝銷售商城系統(tǒng)的實(shí)現(xiàn)流程
基礎(chǔ)掌握怎么樣,用實(shí)戰(zhàn)檢驗(yàn)就知道了,本篇文章手把手帶你用java+SpringBoot+Maven+Vue+mysql實(shí)現(xiàn)一個(gè)在線服裝銷售商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(56)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08

