引入quartz
在springboot2.x以上版本中,都可以很方便的引入quartz,如下,在pom中增加一個(gè)dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
配置Scheduler和SchedulerFactory
我在這里只是最簡(jiǎn)單的介紹一下springboot中quartz怎么使用,因此省略了很多復(fù)雜的步驟,如果想了解的更深入的話可以聯(lián)系我活著翻閱源碼
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import java.io.IOException;
/**
* @author wangcanfeng
* @description 配置scheduler工廠和scheduler,這里可以注入預(yù)先準(zhǔn)備好的executor
*或者使用系統(tǒng)默認(rèn)的executor,都很方便,也可以把一些關(guān)鍵的參數(shù)放置在配置文件中,通過(guò)配置文件加載
* @Date Created in 11:58-2019/3/15
*/
@Configuration
public class SchedulerAutoConfiguration {
//這個(gè)地方如果需要使用自定義的executor,可以在別的地方配置好,然后這里注入
//@Autowired
//private ThreadPoolTaskExecutor taskExecutor;
@Bean(name="SchedulerFactory")
public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setAutoStartup(true);
//這里如果不配置任務(wù)池,它就會(huì)默認(rèn)加載SimpleThreadPool
//factory.setTaskExecutor();
return factory;
}
@Bean(name="funnyScheduler")
public Scheduler scheduler() throws IOException {
return schedulerFactoryBean().getScheduler();
}
}
聲明任務(wù)處理的curd接口
/**
* @author wangcanfeng
* @description
* @Date Created in 13:53-2019/3/15
*/
public interface JobScheduleService {
/**
* 功能描述: 添加簡(jiǎn)單任務(wù)
* @param 可以自定義一個(gè)任務(wù)信息對(duì)象,然后從信息對(duì)象中獲取參數(shù)創(chuàng)建簡(jiǎn)單任務(wù)
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void addSimpleJob();
/**
* 功能描述: 添加定時(shí)任務(wù)
* @param 可以自定義一個(gè)任務(wù)信息對(duì)象,然后從信息對(duì)象中獲取參數(shù)創(chuàng)建定時(shí)任務(wù)
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void addCronJob();
/**
* 功能描述: 修改任務(wù)Trigger,即修改任務(wù)的定時(shí)機(jī)制
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void modifyJob();
/**
* 功能描述: 暫停任務(wù),只支持定時(shí)任務(wù)的暫停,不支持單次任務(wù),單次任務(wù)需要interrupt
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void pauseJob();
/**
* 功能描述: 從暫停狀態(tài)中恢復(fù)定時(shí)任務(wù)運(yùn)行
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void resumeJob();
/**
* 功能描述: 刪除任務(wù)
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
void deleteJob();
}
定義任務(wù)Class
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author wangcanfeng
* @description
* @Date Created in 13:49-2019/3/15
*/
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("簡(jiǎn)單任務(wù)執(zhí)行中");
}
}
任務(wù)處理的接口實(shí)現(xiàn)
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.Date;
/**
* @author wangcanfeng
* @description
* @Date Created in 14:02-2019/3/15
*/
@Service
public class JobScheduleServiceImpl implements JobScheduleService {
/**
* 因?yàn)樵谂渲弥性O(shè)定了這個(gè)bean的名稱,這里就需要指定bean的名稱,不然啟動(dòng)就會(huì)報(bào)錯(cuò)
*/
@Autowired
@Qualifier("funnyScheduler")
private Scheduler scheduler;
/**
* 功能描述: 添加簡(jiǎn)單任務(wù)
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void addSimpleJob(){
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
.withIdentity("testJob01", "testJob")
.build();
Date date=new Date();
date.setTime(1552636529000l);
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("testTrigger01", "testTrigger")
.startAt(date)
.build();
try {
scheduler.scheduleJob(jobDetail,simpleTrigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 功能描述: 添加定時(shí)任務(wù)
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void addCronJob() {
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
.withIdentity("testJob01", "testJob")
.build();
//表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("* * * * * ? *");
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().
withIdentity("cronTrigger01","cronTrigger")
.withSchedule(scheduleBuilder)
.build();
try {
scheduler.scheduleJob(jobDetail,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 功能描述: 修改任務(wù)Trigger,即修改任務(wù)的定時(shí)機(jī)制
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void modifyJob() {
TriggerKey oldKey=new TriggerKey("testTrigger01","testTrigger");
//表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("* * * * * ? *");
//按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().
withIdentity("cronTrigger01","cronTrigger")
.withSchedule(scheduleBuilder)
.build();
try {
scheduler.rescheduleJob(oldKey,trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 功能描述: 暫停任務(wù),只支持定時(shí)任務(wù)的暫停,不支持單次任務(wù),單次任務(wù)需要interrupt
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void pauseJob() {
JobKey jobKey=new JobKey("testJob01","testJob");
try {
JobDetail jobDetail= scheduler.getJobDetail(jobKey);
if(ObjectUtils.isEmpty(jobDetail)){
System.out.println("沒有這個(gè)job");
}
} catch (SchedulerException e) {
e.printStackTrace();
}
try {
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 功能描述: 從暫停狀態(tài)中恢復(fù)定時(shí)任務(wù)運(yùn)行
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void resumeJob() {
JobKey jobKey=new JobKey("testJob01","testJob");
try {
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 功能描述: 刪除任務(wù)
* @param
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/15 17:00
*/
@Override
public void deleteJob() {
JobKey jobKey=new JobKey("testJob01","testJob");
try {
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
然后就可以在controller中注入service,然后調(diào)用service中的方法,對(duì)任務(wù)進(jìn)行curd操作了,是不是很簡(jiǎn)單呢,喜歡的話伸出你的點(diǎn)贊手,點(diǎn)個(gè)贊吧,如果有時(shí)間的話能去我的個(gè)人網(wǎng)站晃一圈就更好了
http://www.canfeng.xyz