Quartz定时器非常强大,但是有时候我们想要不重就能动态的改变Cron表达式的值。
这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值。
每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。
一:定时调度任务
public classDailyScheduledJob extendsQuartzJobBean {
// 开关(控制定时任务是否开启)
private Boolean isOpen;
privateApplicationContext context;
private staticLogger logger= Logger.getLogger(DailyScheduledJob.class);
protected voidexecuteInternal(JobExecutionContextcontext)throwsJobExecutionException{
// 平台控制开关
if (!isOpen) {
return;
}
try {
// 清理过期订单
cleanSubs();
} catch (Exception e) {
logger.error("Daily线程清理过期订单出错!",e);
}
}
/**
*清理过期订单
*/
public void cleanSubs() {
try {
ISubsService subsService =(ISubsService)context.getBean("subsService");
subsService.cleanNoPayed();
} catch (BeansException e) {
logger.error("清理过期订单失败!");
} catch (Exception ex) {
logger.error("清理过期订单",ex);
}
}
public void setContextUtil(ApplicationContextUtil contextUtil){
this.context= contextUtil.getContext();
}
public void setIsOpen(Boolean isOpen) {
this.isOpen= isOpen;
}
}
二:spring配置
<beanid="dailyTask"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<propertyname="jobClass"value="com.google.busi.schedule.DailyScheduledJob"/>
<propertyname="durability"value="true"/>
<propertyname="jobDataMap">
<map>
<entrykey="contextUtil"value-ref="applicationContextUtil"/>
<!-- 定时任务执行开关 -->
<entry key="isOpen"value="${googles.schedule.isopen}"/>
</map>
</property>
</bean>
<beanid="inquiryCronTrigger"class="com.google.busi.schedule.InitCronTriggerFactoryBean">
<propertyname="jobDetail"ref="dailyTask"/>
<!-- <property name="key"value="inquiryQuartzParam" /> -->
<property name="baseConfigService"ref="baseConfigService"/>
</bean>
<beanid="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<propertyname="triggers">
<list>
<refbean="inquiryCronTrigger"/>
<refbean="cronTrigger"/>
</list>
</property>
</bean>
三:项目启动时从数据库读取cron表达式,初始化Trigger
这里记得setName
/**
*服务器启动时,从baseConfig读取配置文件配置的时间
*@author Administrator
*
*/
public classInitCronTriggerFactoryBean extendsCronTriggerFactoryBean implementsSerializable {
//private static final longserialVersionUID = 1L;
private static final long serialVersionUID= -5937544121329980033L;
public static finalString SUBS_NOPAY_TRIGGER="SUBS_NOPAY_TRIGGER";
privateIBaseConfigService baseConfigService;// =(IBaseConfigService)context.getBean("baseConfigService");
/*private String key;
public void setKey(String key) {
this.key = key;
}*/
public void setBaseConfigService(IBaseConfigServicebaseConfigService) {
this.baseConfigService=baseConfigService;
setName(SUBS_NOPAY_TRIGGER);
setCronExpression(getCronExpressionFromDB());
System.out.println(SUBS_NOPAY_TRIGGER+ ":"+getCronExpressionFromDB());
}
private String getCronExpressionFromDB() { //从数据库拿到表达式
StringsysParam =newString();
returnDateUtil.parseExpression(Integer.valueOf(baseConfigService.loadBaseConfigByKey(Constants.NOPAY_SUBS_AGE).getConfigValue())/60);
}
}
四:动态设置cron表达式的接口和实现类
接口
packagecom.google.busi.service.intf.busi;
importjava.util.Date;
importorg.quartz.CronExpression;
public interfaceISchedulerService {
/**
*根据 Quartz Cron Expression调试任务
*
*@param cronExpression
* Quartz Cron 表达式,如"0/10 * * ? * * *"等
*/
void schedule(String cronExpression);
/**
*根据 Quartz Cron Expression调试任务
*
*@param name
* Quartz CronTrigger名称
* @param cronExpression
* Quartz Cron 表达式,如"0/10 * * ? * * *"等
*/
void schedule(String name,String cronExpression);
/**
*根据 Quartz Cron Expression调试任务
*
*@param name
* Quartz CronTrigger名称
* @param group
* Quartz CronTrigger组
*@param cronExpression
* Quartz Cron 表达式,如"0/10 * * ? * * *"等
*/
void schedule