在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能。
添加依赖包
<!-- quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
SchedulerConfig
package com.quartz;
import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class SchedulerConfig implements SchedulerFactoryBeanCustomizer{
@Override
public void customize(SchedulerFactoryBean schedulerFactoryBean) {
schedulerFactoryBean.setStartupDelay(2);
schedulerFactoryBean.setAutoStartup(true);
schedulerFactoryBean.setOverwriteExistingJobs(true);
}
}
application.yml配置
server:
port: 8003
# 默认的profile为dev,其他环境通过指定启动参数使用不同的profile,比如:
# 测试环境:java -jar quartz-service.jar --spring.profiles.active=test
# 生产环境:java -jar quartz-service.jar --spring.profiles.active=prod
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource #这里是配置druid连接池,以下都是druid的配置信息
url: jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
quartz:
#相关属性配置
properties:
org:
quartz:
scheduler:
instanceName: clusteredScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 10000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
#数据库方式
job-store-type: jdbc
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml #把xml文件放在com.XX.mapper.*中可能会出现找到的问题,这里把他放在resource下的mapper中
typeAliasesPackage: com.quartz.domain #这里是实体类的位置,#实体扫描,多个package用逗号或者分号分隔
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
logging:
file: quartz-service.log
level:
com.paiye: debug
JobController
package com.quartz.controller;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.quartz.BaseController;
import com.quartz.api.IJobAndTriggerService;
import com.quartz.util.PageUtil;
import com.quartz.util.ResponseEntity;
/**
* @ClassName: JobController
* @Description: TODO()
* @author lixin([email protected])
* @date 2018年8月15日 上午10:02:00
* @version V1.0
*/
@Controller
@RequestMapping(value = "/job")
public class JobController extends BaseController {
@Autowired
private IJobAndTriggerService jobAndTriggerService;
private static Logger log = LoggerFactory.getLogger(JobController.class);
@RequestMapping(value = "/datagrid", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> queryjob(PageUtil search, HttpServletRequest request,HttpServletResponse response) {
log.debug("queryjob");
setHeader(response);
search.setParams(getParams(request));
return jobAndTriggerService.getPageJob(search);
}
/**
* @Title: addJob
* @Description: TODO(添加Job)
* @param jobClassName
* 类名
* @param jobGroupName
* 组名
* @param cronExpression
* 表达式,如:0/5 * * * * ? (每隔5秒)
*/
@RequestMapping(value = "/add", method = RequestMethod.POST)
public @ResponseBody ResponseEntity addJob(
@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
@RequestParam(value = "cronExpression") String cronExpression,
HttpServletResponse response){
try {
setHeader(response);
jobAndTriggerService.addJob(jobClassName, jobGroupName, cronExpression);
return ResponseEntity.SUCCESS();
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.FAILURE(e.getMessage());
}
}
/**
* @Title: pauseJob
* @Description: TODO(暂停Job)
* @param jobClassName
* 类名
* @param jobGroupName
* 组名
*/
@RequestMapping(value = "/pause", method = RequestMethod.POST)
public @ResponseBody ResponseEntity pauseJob(
@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
HttpServletResponse response) {
try {
setHeader(response);
jobAndTriggerService.pauseJob(jobClassName, jobGroupName);
return ResponseEntity.SUCCESS();
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.FAILURE(e.getMessage());
}
}
/**
* @Title: resumeJob
* @Description: TODO(恢复Job)
* @param jobClassName
* 类名
* @param jobGroupName
* 组名
*/
@RequestMapping(value = "/resume", method = RequestMethod.POST)
public @ResponseBody ResponseEntity resumeJob(
@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
HttpServletResponse response) {
try {
setHeader(response);
jobAndTriggerService.resumejob(jobClassName, jobGroupName);
return ResponseEntity.SUCCESS();
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.FAILURE(e.getMessage());
}
}
/**
* @Title: rescheduleJob
* @Description: TODO(重新设置Job)
* @param jobClassName
* 类名
* @param jobGroupName
* 组名
* @param cronExpression
* 表达式
*/
@RequestMapping(value = "/reschedule", method = RequestMethod.POST)
public @ResponseBody ResponseEntity rescheduleJob(
@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
@RequestParam(value = "cronExpression") String cronExpression,
HttpServletResponse response) {
try {
setHeader(response);
jobAndTriggerService.updateJob(jobClassName, jobGroupName, cronExpression);
return ResponseEntity.SUCCESS();
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.FAILURE(e.getMessage());
}
}
/**
* @Title: deleteJob
* @Description: TODO(删除Job)
* @param jobClassName
* 类名
* @param jobGroupName
* 组名
* @param cronExpression
* 表达式
*/
@RequestMapping(value = "/del", method = RequestMethod.POST)
public @ResponseBody ResponseEntity deleteJob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName,
HttpServletResponse response) {
try {
setHeader(response);
jobAndTriggerService.deleteJob(jobClassName, jobGroupName);
return ResponseEntity.SUCCESS();
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.FAILURE(e.getMessage());
}
}
/*@PostMapping(value = "/addjob")
public void addjob(@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
@RequestParam(value = "cronExpression") String cronExpression) throws Exception {
jobAndTriggerService.addJob(jobClassName, jobGroupName, cronExpression);
}
@PostMapping(value = "/pausejob")
public void pausejob(@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
jobAndTriggerService.pauseJob(jobClassName, jobGroupName);
}
@PostMapping(value = "/resumejob")
public void resumejob(@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
jobAndTriggerService.resumejob(jobClassName, jobGroupName);
}
@PostMapping(value = "/reschedulejob")
public void rescheduleJob(@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName,
@RequestParam(value = "cronExpression") String cronExpression) throws Exception {
jobAndTriggerService.updateJob(jobClassName, jobGroupName, cronExpression);
}
@PostMapping(value = "/deletejob")
public void deletejob(@RequestParam(value = "jobClassName") String jobClassName,
@RequestParam(value = "jobGroupName") String jobGroupName) throws Exception {
jobAndTriggerService.deleteJob(jobClassName, jobGroupName);
}
*/
}
JobAndTriggerImpl
package com.quartz.service.impl;
import java.util.List;
import java.util.Map;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.quartz.api.IJobAndTriggerService;
import com.quartz.dto.JobAndTriggerDto;
import com.quartz.job.BaseJob;
import com.quartz.mapper.JobAndTriggerMapper;
import com.quartz.util.PageUtil;
/**
* @ClassName: JobAndTriggerImpl
* @Description: TODO()
* @author lixin([email protected])
* @date 2018年3月15日 上午10:03:00
* @version V1.0
*/
@Service
public class JobAndTriggerImpl implements IJobAndTriggerService {
@Autowired
private Scheduler scheduler;
@Autowired
// 加入Qulifier注解,通过名称注入bean
// @Qualifier("Scheduler")
private JobAndTriggerMapper jobAndTriggerMapper;
public Map<String, Object> getPageJob(PageUtil search) {
Pagination page = new Page<Object>(search.getPage(), search.getRows(), search.getSort());
List<JobAndTriggerDto> records = jobAndTriggerMapper.getJobAndTriggerDetails(page);
return search.getResultMap(page.getTotal(), records);
}
@Override
public JobAndTriggerDto getPageJobmod() {
return jobAndTriggerMapper.getJobAndTriggerDto();
}
@Override
public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
// 启动调度器
scheduler.start();
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
.withIdentity(jobClassName, jobGroupName).build();
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
.withSchedule(scheduleBuilder).build();
try {
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("创建定时任务成功");
} catch (SchedulerException e) {
System.out.println("创建定时任务失败" + e);
throw new Exception("创建定时任务失败");
}
}
@Override
public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
System.out.println("更新定时任务失败" + e);
throw new Exception("更新定时任务失败");
}
}
@Override
public void deleteJob(String jobClassName, String jobGroupName) throws Exception {
scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
}
@Override
public void pauseJob(String jobClassName, String jobGroupName) throws Exception {
scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));
}
@Override
public void resumejob(String jobClassName, String jobGroupName) throws Exception {
scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));
}
public static BaseJob getClass(String classname) throws Exception {
Class<?> class1 = Class.forName(classname);
return (BaseJob) class1.newInstance();
}
}
Github项目地址:项目demo下载
项目效果:
如有问题请留言