在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能。
添加依赖包
org.springframework.boot
spring-boot-starter-quartz
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.quartz: 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 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 getPageJob(PageUtil search) {
Pagination page = new Page
Github项目地址:项目demo下载
项目效果: