api文档
中文文档:https://www.w3cschool.cn/quartz_doc/
英文文档:http://www.quartz-scheduler.org
Maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
表设计
/*
Navicat MySQL Data Transfer
Source Server : 192.168.3.58_3306
Source Server Version : 50636
Source Host : 192.168.3.58:3306
Source Database : bhudy
Target Server Type : MYSQL
Target Server Version : 50636
File Encoding : 65001
Date: 2019-11-29 11:53:07
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for crontab
-- ----------------------------
DROP TABLE IF EXISTS `crontab`;
CREATE TABLE `crontab` (
`id` varchar(64) NOT NULL COMMENT 'Id uuid',
`name` varchar(255) DEFAULT NULL COMMENT '任务名',
`cron_time` varchar(255) DEFAULT NULL COMMENT 'cron表达式时间',
`is_open` int(11) DEFAULT NULL COMMENT '是否打开',
`is_system` int(11) DEFAULT NULL COMMENT '0 是系统自带任务 1是其他用户创建',
`is_repeat` int(11) DEFAULT NULL COMMENT '是否有配置cron 表达式 是否重复执行 0执行一次 1有cron表达需要重复执行',
`start_time` datetime DEFAULT NULL COMMENT '当前任务开始时间',
`crontab_type_id` varchar(64) DEFAULT NULL COMMENT '任务类型id',
`task_status` int(11) DEFAULT NULL COMMENT '任务执行状态 : 0 正常 1 异常 2 执行中',
`status` int(11) DEFAULT NULL COMMENT '状态(0正常 1删除 2停用 3冻结)',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务表';
-- ----------------------------
-- Records of crontab
-- ----------------------------
INSERT INTO ` crontab` VALUES ('test1', 'test_1', '1/10 * * * * ? *', '0', '0', '1', '2019-11-04 15:53:07', 'testQuartzUUid', '0', '0', '1', '2019-11-04 15:53:44', '1', '2019-11-04 15:53:49', null);
-- ----------------------------
-- Table structure for crontab_type
-- ----------------------------
DROP TABLE IF EXISTS `crontab_type`;
CREATE TABLE `crontab_type` (
`id` varchar(64) NOT NULL COMMENT 'Id uuid',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`job_class_name` varchar(255) DEFAULT NULL COMMENT 'job对应class',
`status` int(11) DEFAULT NULL COMMENT '状态(0正常 1删除 2停用 3冻结)',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务类型表';
-- ----------------------------
-- Records of crontab_type
-- ----------------------------
INSERT INTO ` crontab_type` VALUES ('testQuartzUUid', 'TestQuartz', 'com.bhudy.quartz.TestQuartz', '0', '1', '2019-11-04 15:51:10', '1', '2019-11-04 15:51:12', 'test');
CrontabService
import com.bhudy.base.BaseService;
import com.bhudy.entity.BhudyCrontab;
import org.quartz.SchedulerException;
import java.io.Serializable;
import java.util.Date;
/**
* @Author 变红叶
* @Description BhudyCrontabService
* @Date Mon Nov 04 14:28:07 CST 2019
*/
public interface BhudyCrontabService extends BaseService<BhudyCrontab, Serializable> {
void startQuartzJobAll();
void createCrontabJob(BhudyCrontab bhudyCrontab) throws Exception;
void addQuartzJob(String jobName, Class jobClass, Date startTime, String resCrontabId) throws SchedulerException;
void addQuartzJob(String jobName, Class jobClass, String time, String resCrontabId) throws SchedulerException;
void removeQuartzJob(String resCrontabId) throws SchedulerException;
void modifyQuartzJobTime(String crontabId) throws Exception;
}
CrontabServiceImpl实现类
import com.bhudy.base.BaseServiceImpl;
import com.bhudy.base.QueryFilter;
import com.bhudy.entity.BhudyCrontab;
import com.bhudy.service.BhudyCrontabService;
import com.bhudy.service.BhudyCrontabTypeService;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* @Author 变红叶
* @Description BhudyCrontabServiceImpl
* @Date Mon Nov 04 14:28:07 CST 2019
*/
@Service
public class BhudyCrontabServiceImpl extends BaseServiceImpl<BhudyCrontab, Serializable> implements BhudyCrontabService {
@Autowired
private BhudyCrontabTypeService bhudyCrontabTypeService;
private QueryFilter queryFilter = new QueryFilter();
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static Scheduler sched;
static {
if (sched == null) {
try {
sched = gSchedulerFactory.getScheduler();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void startQuartzJobAll() {
queryFilter.clear().and("status", 0);
List<BhudyCrontab> bhudyCrontabList = super.findList(queryFilter);
if (bhudyCrontabList != null && bhudyCrontabList.size() != 0) {
for (BhudyCrontab bhudyCrontab : bhudyCrontabList) {
try {
this.createCrontabJob(bhudyCrontab);
} catch (Exception e) {
bhudyCrontab.setTaskStatus(1);
super.update(bhudyCrontab);
e.printStackTrace();
}
}
}
}
/**
* 新增任务 调用方法
*/
@Override
public void createCrontabJob(BhudyCrontab bhudyCrontab) throws Exception {
if (bhudyCrontab.getIsOpen() == 1) return;
// 找到当前任务类型对应class
Class cls = bhudyCrontabTypeService.checkJobClass(bhudyCrontab.getBhudyCrontabTypeId());
//每次都是动态的根据表中用户配置
if (bhudyCrontab.getIsRepeat() == 0) {
// 等于0 只执行一次
addQuartzJob(bhudyCrontab.getName(), cls, bhudyCrontab.getStartTime(), bhudyCrontab.getId());
} else {
//否则是需要利用cron 表达式执行的任务
addQuartzJob(bhudyCrontab.getName(), cls, bhudyCrontab.getCronTime(), bhudyCrontab.getId());
}
}
/**
* @param jobName 任务名
* @param jobClass 任务
* @param startTime 时间设置 当前任务不重复执行开始时间
*/
@Override
public void addQuartzJob(String jobName, Class jobClass, Date startTime, String resCrontabId) throws SchedulerException {
JobDetail jobDetail = newJob(jobClass).build();
Trigger trigger = newTrigger()
.withIdentity(resCrontabId)
.usingJobData(BhudyCrontab.JOB_NAME, jobName)
.usingJobData(BhudyCrontab.CRONTAB_ID, resCrontabId)
.withSchedule(simpleSchedule())
.startAt(startTime).build();
sched.scheduleJob(jobDetail, trigger);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
}
/**
* @param jobName 任务名
* @param jobClass 对应任务 jobClass
* @param time cron表达式
* @Description: 添加一个定时任务
*/
@Override
public void addQuartzJob(String jobName, Class jobClass, String time, String resCrontabId) throws SchedulerException {
// JobDetail jobDetail = newJob(jobClass).withIdentity(jobName, GROUP_NAME).build();// 任务名,任务组,任务执行类
JobDetail jobDetail = newJob(jobClass).build();
// 触发器
Trigger trigger = newTrigger()
.withIdentity(resCrontabId)
//把一些 任务 key - value 存到当前任务中 例如备注
.usingJobData(BhudyCrontab.JOB_NAME, jobName)
.usingJobData(BhudyCrontab.CRONTAB_ID, resCrontabId)
.withSchedule(cronSchedule(time)).startNow().build();
sched.scheduleJob(jobDetail, trigger);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
}
/**
* @param resCrontabId
* @Description: 移除一个任务(使用默认的任务组名触发器名触发器组名)
*/
@Override
public void removeQuartzJob(String resCrontabId) throws SchedulerException {
sched.pauseTrigger(TriggerKey.triggerKey(resCrontabId));// 停止触发器
sched.unscheduleJob(TriggerKey.triggerKey(resCrontabId));// 移除触发器
//上面两个api 有可能已经删除了对应job
Trigger trigger = sched.getTrigger(TriggerKey.triggerKey(resCrontabId));
if (trigger != null) {
sched.deleteJob(trigger.getJobKey());// 删除任务
}
}
/**
* @Description: 修改一个任务的触发时间
*/
@Override
public void modifyQuartzJobTime(String crontabId) throws Exception {
BhudyCrontab bhudyCrontab = super.get(crontabId);
//获取当前 jobName 和组下的trigger
Trigger trigger = sched.getTrigger(TriggerKey.triggerKey(crontabId));
if (trigger != null) {
//如果当前任务不存在
removeQuartzJob(crontabId);
}
createCrontabJob(bhudyCrontab);
}
}
调用方法
import com.bhudy.entity.BhudyCrontab;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
/**
* 变红叶
* Created by Administrator on 2019/11/4/004.
*/
@Component
public class TestQuartz implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
String bhudyCrontabId = jobDataMap.getString(BhudyCrontab.CRONTAB_ID);
System.out.println(bhudyCrontabId);
}
}
监听器里面启动定时器
import com.bhudy.service.BhudyCrontabService;
import com.bhudy.service.KtrInfoService;
import com.bhudy.utils.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @Author 变红叶
* @Description 监听器
* @Date 2019-10-30 23:09:37
*/
@WebListener
public class BhudyListener implements ServletContextListener {
@Value("${bhudy.routerControl}")
private Integer routerControl;
@Override
public void contextInitialized(ServletContextEvent sce) {
// 启动所有定时器
// BhudyCrontabService bhudyCrontabService = Utils.getBean(BhudyCrontabService.class);
bhudyCrontabService.startQuartzJobAll();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("FirstListener:Servlet容器被销毁了");
}
}