一、添加依賴:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注:此處示例是將任務job存儲在mysql數據庫中,所以需要使用到jdbc和mysql的相關依賴;
二、數據庫插入quartz的表結構:
可以去官網下載對應使用的quartz包,解壓後docs/db Tables 目錄下;
如下圖所示表:
三、編輯application.yml配置文件
server:
port: 8083
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///quarzt
username: root
password: 123456
注:就是要操作的數據庫的配置信息
四、編輯quartz的配置信息類
@Component
public class QuartzConfig {
private static Logger logger = LoggerFactory.getLogger(QuartzConfig.class);
@Resource
private DataSource dataSource;
@Resource
private PlatformTransactionManager transactionManager;
@Bean(name = "schedulerFactor")
public SchedulerFactoryBean getSchedulerFactor(){
logger.info("***start init scheduler factory***");
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
//設置數據源
factoryBean.setDataSource(dataSource);
factoryBean.setTransactionManager(transactionManager);
//設置覆蓋已經存在的任務
factoryBean.setOverwriteExistingJobs(true);
//設置30秒開始初始化調度器
factoryBean.setStartupDelay(30);
//設置調度器自動運行
factoryBean.setAutoStartup(true);
return factoryBean;
}
}
五、定義quartz需要使用到的接口:
package com.zgl.quartzstudy.quartz;
import org.quartz.SchedulerException;
import java.util.Map;
/**
* ProjectName:quartz-study
* Date:2019/11/20
* @Author: Guolin.Zhan
* Desc:
*/
public interface QuartzService {
/**
* 添加調度
* @param jobClassName
* @param groupName
* @param jobName
* @param dataMap
* @return
*/
boolean addScheduler(String jobClassName, String groupName, String jobName, Map<String,Object> dataMap) throws ClassNotFoundException, IllegalAccessException, InstantiationException, SchedulerException;
/**
* 刪除定時任務job
* @param jobName job名稱
* @param groupName job組名稱
* @return
* @throws SchedulerException
*/
boolean deleteScheduler(String jobName, String groupName) throws SchedulerException;
/**
* 暫停任務job
* @param jobName
* @param groupName
* @return
*/
boolean pauseJob(String jobName,String groupName) throws SchedulerException;
/**
* 暫停所有任務job
* @return
*/
boolean pauseAll() throws SchedulerException;
/**
* 恢復任務job
* @param jobName
* @param groupName
* @return
*/
boolean resumeJob(String jobName,String groupName) throws SchedulerException;
/**
* 恢復所有任務
* @return
*/
boolean resumeAll() throws SchedulerException;
/**
* 暫停調度器
* @param jobClassName job權限定類名稱
* @param groupName job組名稱
* @return
*/
boolean pauseTrigger(String jobClassName, String groupName) throws SchedulerException;
/**
* 恢復調度器
* @param jobClassName
* @param groupName
* @return
*/
boolean resumeTrigger(String jobClassName, String groupName) throws SchedulerException;
}
六、實現定義quartz接口類:
package com.zgl.quartzstudy.quartz;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.JobKey.jobKey;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.TriggerKey.triggerKey;
/**
* ProjectName:quartz-study
* Date:2019/11/20
* @Author: Guolin.Zhan
* Desc:
*/
@Service
public class QuartzServiceImpl implements QuartzService{
@Resource
private Scheduler scheduler;
@Override
public boolean addScheduler(String jobClassName, String groupName, String jobName, Map<String, Object> dataMap) throws ClassNotFoundException, IllegalAccessException, InstantiationException, SchedulerException {
//注:jobClassName是類的全限定名稱
Job job = (Job) Class.forName(jobClassName).newInstance();
JobDetail jobDetail = newJob(job.getClass())
.withIdentity(jobName, groupName)
.build();
jobDetail.getJobDataMap().putAll(dataMap);
SimpleTrigger trigger = newTrigger()
.withIdentity(jobClassName, groupName)
.withSchedule(
simpleSchedule()
.withIntervalInMilliseconds(100)
.repeatForever()
).build();
scheduler.scheduleJob(jobDetail,trigger);
return true;
}
@Override
public boolean deleteScheduler(String jobName, String groupName) throws SchedulerException {
JobKey jobKey = jobKey(jobName, groupName);
scheduler.pauseJob(jobKey);
scheduler.deleteJob(jobKey);
return true;
}
@Override
public boolean pauseJob(String jobName, String groupName) throws SchedulerException {
JobKey jobKey = jobKey(jobName, groupName);
scheduler.pauseJob(jobKey);
return true;
}
@Override
public boolean pauseAll() throws SchedulerException {
scheduler.pauseAll();
return true;
}
@Override
public boolean resumeJob(String jobName, String groupName) throws SchedulerException {
JobKey jobKey = jobKey(jobName, groupName);
scheduler.resumeJob(jobKey);
return true;
}
@Override
public boolean resumeAll() throws SchedulerException {
scheduler.resumeAll();
return true;
}
@Override
public boolean pauseTrigger(String jobClassName, String groupName) throws SchedulerException {
TriggerKey triggerKey = triggerKey(jobClassName, groupName);
scheduler.pauseTrigger(triggerKey);
return true;
}
@Override
public boolean resumeTrigger(String jobClassName, String groupName) throws SchedulerException {
TriggerKey triggerKey = triggerKey(jobClassName, groupName);
scheduler.resumeTrigger(triggerKey);
return true;
}
}
七、定義job類:
package com.zgl.quartzstudy.job;
import org.quartz.*;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* ProjectName:quartz-study
* Date:2019/11/19
* @Author: Guolin.Zhan
* Desc:
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class MyJob implements Job {
public MyJob() {
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//此處編輯需要實現的業務邏輯
System.out.println("***********被調度了***********");
}
}
八、測試類:
package com.zgl.quartzstudy;
import com.zgl.quartzstudy.quartz.QuartzService;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* ProjectName:quartz-study
* Date:2019/11/20
* @Author: Guolin.Zhan
* Desc:
*/
@RestController
@RequestMapping("/test-scheduler")
public class QuartzTest {
@Autowired
private QuartzService quartzService;
@GetMapping("/add-scheduler")
public boolean addScheduler(@RequestParam String jobClassName,
@RequestParam String groupName,
@RequestParam String jobName,
@RequestParam Map<String,Object> dataMap) throws Exception {
return quartzService.addScheduler(jobClassName,groupName,jobName,dataMap);
}
@DeleteMapping("/delete-scheduler")
public boolean deleteScheduler(@RequestParam String jobName, @RequestParam String groupName) throws SchedulerException {
return quartzService.deleteScheduler(jobName,groupName);
}
@GetMapping("/pause-job")
public boolean pauseJob(@RequestParam String jobName, @RequestParam String groupName) throws SchedulerException {
return quartzService.pauseJob(jobName,groupName);
}
@GetMapping("/pause-all")
public boolean pauseAll() throws SchedulerException {
return quartzService.pauseAll();
}
@GetMapping("/resume-job")
public boolean resumeJob(@RequestParam String jobName, @RequestParam String groupName) throws SchedulerException {
return quartzService.resumeJob(jobName,groupName);
}
@GetMapping("/resume-all")
public boolean resumeAll() throws SchedulerException {
return quartzService.resumeAll();
}
@GetMapping("/pause-trigger")
public boolean pauseTrigger(@RequestParam String jobClassName, @RequestParam String groupName) throws SchedulerException {
return quartzService.pauseTrigger(jobClassName,groupName);
}
@GetMapping("/resume-trigger")
public boolean resumeTrigger(@RequestParam String jobClassName, @RequestParam String groupName) throws SchedulerException {
return quartzService.resumeTrigger(jobClassName,groupName);
}
}