1、添加maven依赖
代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、实现job接口,并在execute方法中实现业务逻辑
代码如下:
public class PrintWordsJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(PrintWordsJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String printTime = new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date());
// 这里处理简单,只做打印时间,getMergedJobDataMap()方法是获取 JobDetail 中传递的的 usingJobData
logger.info("PrintWordsJob start at: {}, map: {}", printTime, jobExecutionContext.getMergedJobDataMap().get("name"));
}
}
3、实现一个简单的定时任务
代码如下:
public void test() throws SchedulerException {
// 定义作业的实例
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
// 任务标识,及任务分组
.withIdentity("job", "group")
// 链接调用,增加需要的参数
.usingJobData("name","guaniu")
.build();
// 触发器
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity("trigger", "group")
// 立即执行
.startNow()
// 10s后停止
.endAt(new Date(System.currentTimeMillis()+10*1000))
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
// 每秒执行一次
.withIntervalInSeconds(1)
// 一直执行
.repeatForever()
).build();
scheduler.scheduleJob(jobDetail, simpleTrigger);
}
简单封装的工具类
代码如下:
@Component
public class QuartzUtils {
private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);
@Autowired
private Scheduler scheduler;
/**
* @param quartzDataDomain
* {
* "jobName": "guaniu",
* "jobGroup": "test",
* "cron": "0/2 * * * * ?",
* "triggerName": "manual",
* "triggerGroup": "manualGroup",
* "usingJobDataMap": {
* "name": "guaniu"
* },
* "category": "create"
* }
* jobName、jobGroup要在前端传值试效验,保证唯一不重复,
* 否则会报错:Unable to store Job : 'test1.guaniu1', because one already exists with this identification.
*/
public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String category = quartzDataDomain.getCategory();
if (category.equals("create")){
createJob(quartzDataDomain);
}else if (category.equals("modify")){
modifyJob(quartzDataDomain);
}else if (category.equals("pause")){
pauseJob(quartzDataDomain);
}else if (category.equals("resume")){
resumeJob(quartzDataDomain);
}else if (category.equals("deleteJob")){
deleteJob(quartzDataDomain);
}
}
public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String category = quartzDataDomain.getCategory();
if (category.equals("create")){
createJob(quartzDataDomain);
}else if (category.equals("modify")){
modifyJob(quartzDataDomain);
}else if (category.equals("pause")){
pauseJob(quartzDataDomain);
}else if (category.equals("resume")){
resumeJob(quartzDataDomain);
}else if (category.equals("deleteJob")){
deleteJob(quartzDataDomain);
}
}
// 创建并有运行job
private void createJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
// 如果这个任务存在就删除
deleteJob(quartzDataDomain);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.scheduleJob(initJobDetail(quartzDataDomain), trigger);
}
// 修改job的cron
private void modifyJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime = cronTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(quartzDataDomain.getCron())){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
.withSchedule(cronScheduleBuilder)
.build();
scheduler.rescheduleJob(triggerKey, trigger);
}
}
// 暂停job
private void pauseJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
JobKey jobKey = initJobKey(quartzDataDomain);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail != null){
scheduler.pauseJob(jobKey);
}
}
// 暂停所有的job
// public void pauseAllJob() throws SchedulerException {
// scheduler.pauseAll();
// }
// 重新运行job
private void resumeJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
JobKey jobKey = initJobKey(quartzDataDomain);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail != null){
scheduler.resumeJob(jobKey);
}
}
// 重新运行所有的job
// public void resumeAllJob() throws SchedulerException {
// scheduler.resumeAll();
// }
// 删除job
private void deleteJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
JobKey jobKey = initJobKey(quartzDataDomain);
Trigger trigger = scheduler.getTrigger(triggerKey);
if(trigger != null){
// 停止触发器
scheduler.pauseTrigger(triggerKey);
// 移除触发器
scheduler.unscheduleJob(triggerKey);
// 删除任务
scheduler.deleteJob(jobKey);
}
}
public String checkTriggerStatus(QuartzDataDomain quartzDataDomain) throws SchedulerException {
String result;
Trigger.TriggerState triggerState = scheduler.getTriggerState(TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup()));
switch (triggerState){
case NONE:
result = "不存在";
logger.info("status: {}, quartzDataDomain: {}", "不存在", quartzDataDomain);
return result;
case ERROR:
result = "错误";
logger.info("status: {}, quartzDataDomain: {}", "错误", quartzDataDomain);
return result;
case NORMAL:
result = "正常";
logger.info("status: {}, quartzDataDomain: {}", "正常", quartzDataDomain);
return result;
case PAUSED:
result = "暂停";
logger.info("status: {}, quartzDataDomain: {}", "暂停", quartzDataDomain);
return result;
case BLOCKED:
result = "阻塞";
logger.info("status: {}, quartzDataDomain: {}", "阻塞", quartzDataDomain);
return result;
case COMPLETE:
result = "完成";
logger.info("status: {}, quartzDataDomain: {}", "完成", quartzDataDomain);
return result;
default:
result = "未知现象";
logger.info("status: {}, quartzDataDomain: {}", triggerState, quartzDataDomain);
}
return result;
}
private static JobKey initJobKey(QuartzDataDomain quartzDataDomain){
return new JobKey(quartzDataDomain.getJobName(), quartzDataDomain.getJobGroup());
}
private static JobDetail initJobDetail(QuartzDataDomain quartzDataDomain){
JobDataMap jobDataMap = new JobDataMap();
Map<String, Object> map = quartzDataDomain.getUsingJobDataMap();
if (map != null && !map.isEmpty()){
for (Map.Entry<String, Object> m: map.entrySet()) {
jobDataMap.put(m.getKey(), m.getValue());
}
return JobBuilder.newJob(PrintWordsJob.class)
.withIdentity(initJobKey(quartzDataDomain))
.usingJobData(jobDataMap)
.build();
}else {
return JobBuilder.newJob(PrintWordsJob.class)
.withIdentity(initJobKey(quartzDataDomain))
.build();
}
}
}
public class QuartzDataDomain {
private String jobName;
private String jobGroup;
private String cron;
private String triggerName;
private String triggerGroup;
private Map<String, Object> usingJobDataMap;
private String category;
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 getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
public String getTriggerName() {
return triggerName;
}
public void setTriggerName(String triggerName) {
this.triggerName = triggerName;
}
public String getTriggerGroup() {
return triggerGroup;
}
public void setTriggerGroup(String triggerGroup) {
this.triggerGroup = triggerGroup;
}
public Map<String, Object> getUsingJobDataMap() {
return usingJobDataMap;
}
public void setUsingJobDataMap(Map<String, Object> usingJobDataMap) {
this.usingJobDataMap = usingJobDataMap;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@Override
public String toString() {
return "QuartzDataDomain{" +
"jobName='" + jobName + '\'' +
", jobGroup='" + jobGroup + '\'' +
", cron='" + cron + '\'' +
", triggerName='" + triggerName + '\'' +
", triggerGroup='" + triggerGroup + '\'' +
", usingJobDataMap=" + usingJobDataMap +
", category='" + category + '\'' +
'}';
}
}