一个可以自己配置,即配即用的quartz定时器封装。
pom.xml配置
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version><!--$NO-MVN-MAN-VER$-->
</dependency>
spring boot依赖略
Quartz定时任务调度器
/**
*
* @ClassName::QuartzScheduler @Description: 定时任务调度器
* @author :柯雷
* @date :2018年11月16日 下午4:33:09
*
*/
public class QuartzScheduler {
/** 日志打印对象 */
private static final Logger logger = LoggerFactory.getLogger(QuartzScheduler.class);
/**
* @Title:doSchedule
* @Description:开始定时调度
* @param :@param clazz 定时任务
* @param :@param jobId 任务id
* @param :@param intervalInMillis 执行时间间隔
* @param :@throws SchedulerException
* @return :void
* @throws
*/
public static void doSchedule(Class<? extends Job> clazz, String jobId, String schedule, Date triggerStartTime) throws SchedulerException {
logger.info("开启定时任务:" + jobId);
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobId, "quartz").build();
// 创建一个Trigger实例,定义该Job在triggerStartTime时间点执行,并且后续按照schedule永远执行
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobId, "quartz").startAt(triggerStartTime)
.withSchedule(cronSchedule(schedule)).build();
// 创建scheduler实例
SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
定时器配置表
--定时器配置表
create table QUARTZ_JOB
(
JOBID VARCHAR2(12),
JBOGROUP VARCHAR2(12),
JOBTYPE VARCHAR2(12),
TASK VARCHAR2(200),
SCHEDULE VARCHAR2(20),
VALIDATED VARCHAR2(6),
MEMO VARCHAR2(200)
) tablespace &&tbsname_data_blog;
comment on table QUARTZ_JOB is '定时器任务配置';
comment on column QUARTZ_JOB.JOBID is '任务id';
comment on column QUARTZ_JOB.JBOGROUP is '任务分组';
comment on column QUARTZ_JOB.JOBTYPE is '任务类型';
comment on column QUARTZ_JOB.TASK is '任务处理类';
comment on column QUARTZ_JOB.SCHEDULE is '任务调度安排';
comment on column QUARTZ_JOB.VALIDATED is '有效标志';
comment on column QUARTZ_JOB.MEMO is '备注';
springboot启动时开启定时任务
通过实现ApplicationRunner接口来将spring bean配置为程序启动即执行,在run方法中查询QUARTZ_JOB表中的定时器配置,根据配置来调用定时器任务调度器来启动定时任务。
/**
*
* @ClassName::QuartScheduleRunner
* @Description: 定时器启动类
* @author :柯雷
* @date :2018年11月16日 下午4:54:04
*
*/
@Component //被spring容器管理
@Order(1) //如果多个自定义ApplicationRunner,用来标明执行顺序
public class QuartScheduleRunner implements ApplicationRunner {
/** 日志打印对象 */
private static final Logger logger =
LoggerFactory.getLogger(QuartScheduleRunner.class);
/** spring boot上下文环境 */
@Autowired
private Environment environment;
@Autowired
CommonMapper commonMapper;
@Override
public void run(ApplicationArguments args) throws Exception {
if ("true".equals(environment.getProperty("app.timer"))) {
logger.info("启动定时器");
List<Map<String, Object>> quartzs = commonMapper.getAllQuartas();
for(Map<String, Object> quartz : quartzs) {
@SuppressWarnings("unchecked")
Class<? extends Job> clazz = (Class<? extends Job>) Class.forName((String) quartz.get("TASK"));
QuartzScheduler.doSchedule(clazz, (String)quartz.get("JOBID"), (String)quartz.get("SCHEDULE"), new Date());
}
}
}
}
使用示例
定时器配置,配置每5分钟执行一次LeceneSearchQuartz定时任务
-- 文章信息索引建立定时器
delete from QUARTZ_JOB where JOBID = '101';
insert into QUARTZ_JOB (JOBID, JBOGROUP, JOBTYPE, TASK, SCHEDULE, VALIDATED, MEMO)
values ('101', 'blog', 'JAVA', 'cn.muchen.blog.lucene.LeceneSearchQuartz', '0 */5 * * * ?', '1', null);
commit;
定时器执行类
/**
*
* @ClassName::LeceneSearchQuartz
* @Description: TODO
* @author :柯雷
* @date :2018年11月27日 下午2:44:20
*
*/
public class LeceneSearchQuartz implements Job {
/** 日志打印对象 */
private static final Logger logger = LoggerFactory.getLogger(LeceneSearchQuartz.class);
/** spring boot上下文环境 */
private Environment environment = (Environment) SpringUtil.getBean("environment");
/**
* 索引生成对象
*/
GeneratorIndex generatorIndex = (GeneratorIndex) SpringUtil.getBean("generatorIndex");
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
// 打印当前执行时间
logger.info("【LeceneSearchQuartz】执行定时器:" + key.getName() + ";开始时间" + Util.getDqrq("yyyy-MM-dd HH:mm:ss"));
try {
generatorIndex.genIndex(environment.getProperty("lucene.path"));
// 打印当前执行时间
logger.info("【LeceneSearchQuartz】执行定时器:" + key.getName() + "成功;结束时间" + Util.getDqrq("yyyy-MM-dd HH:mm:ss"));
} catch (IOException e) {
logger.error("【LeceneSearchQuartz】执行定时器:" + key.getName() + "失败;失败原因:" + e);
}
}
}
当spring程序启动时会自动执行QuartScheduleRunner.run启动定时器,5分钟后会自动执行LeceneSearchQuartz.execute方法。