个人博客系统开发总结之 quartz定时器

      一个可以自己配置,即配即用的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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值