Quartz定时任务 + 读取数据库动态配置周期
1、quartz定时任务配置:<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="ActionCronTrigger"/> <ref bean="ActionOrderCronTrigger"/> <ref bean="InquiryCronTrigger"/> </list> </property> </bean>其中:<ref bean="ActionCronTrigger"/><ref bean="ActionOrderCronTrigger"/><ref bean="InquiryCronTrigger"/>配置对应的定时任务,可配置多个,名称要唯一,对应的是第二步中配置的CronTriggerFactoryBean
2、CronTriggerFactoryBean配置,由于要实现动态读取定时任务周期时间,所以我们要写一邗锒凳审个类实现CronTriggerFactoryBean,类的内容如下:public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable { private static final long serialVersionUID = 1L; private SysParamServiceImpl sysParamServiceImpl; private String key; public void setKey(String key) { this.key = key; } public void setSysParamServiceImpl(SysParamServiceImpl sysParamServiceImpl) { this.sysParamServiceImpl = sysParamServiceImpl; setCronExpression(getCronExpressionFromDB()); } private String getCronExpressionFromDB() { if(StringUtils.isEmpty(key)) return "0 0 0/1 * * ?"; SysParam sysParam = new SysParam(); try { sysParam = sysParamServiceImpl.getNameByKey(key); } catch (Exception e) { e.printStackTrace(); } if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue())) return sysParam.getParamValue(); return "0 0 0/1 * * ?"; } }简单说明一下:key是用来查询数据库配置的CronExpression表达式的查询条件,SysParamServiceImpl 是实现查询的类,这几个参数都要从spring配置的CronTriggerFactoryBean参数获取,注意,配置的时候,key值的配置要在SysParamServiceImpl 的配置之前,否则报空指针
3、spring配置CronTriggerFactoryBean:实现了CronTriggerFactoryBean之后,开始配置CronTriggerFactoryBean,现在配置的是InitCronTriggerFactoryBean :<bean id="InquiryCronTrigger" class="cn.com.shopec.quartz.utils.InitCronTriggerFactoryBean"> <property name="jobDetail" ref="InquiryJobDetail" /> <property name="key" value="inquiryQuartzParam" /> <property name="sysParamServiceImpl" ref="sysParamServiceImpl" /> </bean>id对应quartz定时任务配置的<ref bean="InquiryCronTrigger"/>,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个<property name="jobDetail" ref="InquiryJobDetail" />则是定时任务执行业务逻辑的类ps:<property name="sysParamServiceImpl" ref="sysParamServiceImpl" />,这个要配置对应的bean,我的是<bean id="sysParamServiceImpl" class="cn.com.shopec.core.system.service.impl.SysParamServiceImpl"> </bean>
4、配置对应的定时任务执行业务方法的类:<bean id="InquiryJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="durability" value="true" /> <property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" /> <property name="jobDataAsMap"> <map> <entry key ="inquiryServiceImpl" value-ref="inquiryServiceImpl"/> </map> </property> </bean>简单说明一下:<property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" />配置的是你需要定时执行的类,<property name="jobDataAsMap"> 下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。
5、对应的定时任务执行类:public class InquiryQuartz extends QuartzJobBean {@Autowired private InquiryServiceImpl inquiryServiceImpl; @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {// 实例化接口 inquiryServiceImpl = (InquiryServiceImpl) arg0.getJobDetail().getJobDataMap().get("inquiryServiceImpl");// 执行业务方法 quartzStart(); }public voidquartzStart(){// 业务方法...}}说明一下:必须要实现QuartzJobBean 接口至此,就可以完成可配置CronExpression表达式的定时任务了!1