雨昏连夜催炎暑,暑炎催夜连昏雨。
长簟水波凉,凉波水簟长。
翠鬟双倚醉,醉倚双鬟翠。
香枕印红妆,妆红印枕香。
–《菩萨蛮·雨昏连夜催炎暑》
丝丝凉意沁人心脾,梳理万千思绪。
背景
项目为实现定时向数据仓库中抽取元数据。
技术:定时Spring调度quartz框架+ThreadPoolTaskExecutor连接池+元数据抽取db-meta(在github的基础上改造,支持pg、hive、impala)。
实现方式
每天定时去数据仓库取数据,由于数据仓库中的数据库比较多,引入线程池,以数据库为粒度,每个数据库起一个线程进行抽取。
本文主要介绍自己在使用quartz上遇到的一些“坑”。
quartz的调度时间使用cron表达式。简单的做法是直接在xml配置文件中配置。
本文主要介绍自己在使用quartz上遇到的一些“坑”。
quartz的调度时间使用cron表达式。简单的做法是直接在xml配置文件中配置。1
2
3
4
5
6
7
8
9
10
11<!-- 配置Cron触发器(CronTriggerFactoryBean) -->
<bean id="myJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="metaSchedulejobDetail" />
</property>
<property name="cronExpression">
<!-- 每天0点执行 -->
<value>0 0 0 * * ?</value>
</property>
</bean>
项目需求是需要动态指定,从数据库中读取cronExpression表达式。
实现
编写InitializingCronTrigger继承于Spring的CronTriggerFactoryBean。然后对其中的属性cronExpression进行动态指定(本项目从数据库中读取)。
配置文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
InitializingCronTrigger类实现
1 | public class InitializingCronTrigger extends CronTriggerFactoryBean { |
其他基础Bean及相关基础配置说明省略(不是本文重点)。
需要注意的地方:
- 使用Spring的property方式注入,Spring实现原理是set注入的实现。所以InitializingCronTrigger必须要有对应的set方法。
- 关于this.getCronExpressionFromDB();的调用时机?
起初,我是在构造函数中调用类的私有方法this.getCronExpressionFromDB();结果junit跑用例发现1
List<MtScheduleDo> scheduleDoList = scheduleService.getSchedules(scheduleVo);
scheduleService一直为null,没有注入成功。
后续将this.getCronExpressionFromDB();放在set方法内部,结果成功。
反思
类构造函数和类成员变量
jvm加载类的顺序:执行构造函数,初始化实例变量,执行实例方法。
通过spring的set注入的方式进行属性设值。
以下是debug控制台打印。