在spring框架中通过 @Schedule 可以实现定时任务,通过该注解 cron 的属性描述的规则,spring会去调用这个方法。
spring已经简单粗暴的实现了定时任务,为什么要使用Quartz ?
如果你现在有很多个定时任务,规则不同,例如:
想每月25号,信用卡自动还款
想每年4月1日自己给当年暗恋女神发一封匿名贺卡
想每隔1小时,备份一下自己的爱情动作片 学习笔记到云盘
maven 依赖
org.quartz-scheduler
quartz
2.2.1
org.quartz-scheduler
quartz-jobs
2.2.1
以下是bootdo开源学习框架的源码
我并没有用到全部的字段,思路是先查询DB,
封装以下两个对象
JobDetail 负责存放 job 所需要的数据
Trigger 设置 job 的 key,规则(cron)何时开启任务等属性
当触发条件满足时,会根据所设置的beanClass 找到该类(必须实现org.quartz.Job), 这时可以取出JobDetail 中的数据,执行具体业务逻辑
@Component
public class WelcomeJob implements Job{
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//你的业务逻辑
}
}
表结构
CREATE TABLE `sys_task` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`cronExpression` varchar(255) DEFAULT NULL COMMENT 'cron表达式',
`methodName` varchar(255) DEFAULT NULL COMMENT '任务调用的方法名',
`isConcurrent` varchar(255) DEFAULT NULL COMMENT '任务是否有状态',
`description` varchar(255) DEFAULT NULL COMMENT '任务描述',
`updateBy` varchar(64) DEFAULT NULL COMMENT '更新者',
`beanClass` varchar(255) DEFAULT NULL COMMENT '任务执行时调用哪个类的方法 包名+类名',
`createDate` datetime DEFAULT NULL COMMENT '创建时间',
`jobStatus` varchar(255) DEFAULT NULL COMMENT '任务状态',
`jobGroup` varchar(255) DEFAULT NULL COMMENT '任务分组',
`updateDate` datetime DEFAULT NULL COMMENT '更新时间',
`createBy` varchar(64) DEFAULT NULL COMMENT '创建者',
`springBean` varchar(255) DEFAULT NULL COMMENT 'Spring bean',
`jobName` varchar(255) DEFAULT NULL COMMENT '任务名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
配置类
import java.io.IOException;
import java.util.Properties;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.txgl.common.quartz.factory.JobFactory;
@Configuration
public class QuartzConfigration {
@Autowired
JobFactory jobFactory;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
try {
schedulerFactoryBean.setOverwriteExistingJobs(true);
schedulerFactoryBean.setQuartzProperties(quartzProperties());
schedulerFactoryBean.setJobFactory(jobFactory);
} catch (IOException e) {
e.printStackTrace();
}
return schedulerFactoryBean;
}
// 指定quartz.properties
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
prope