Quartz动态改变Cron表达式,来实现动态执行Spring定时任务

  • Post author:
  • Post category:其他






Q



uartz


定时器非常强大,但是有时候我们想要不重就能动态的改变


Cron


表达式的值。


这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值。


每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。



一:定时调度任务


public class


DailyScheduledJob


extends


QuartzJobBean {




//


开关(控制定时任务是否开启)




private


Boolean


isOpen


;


private


ApplicationContext


context


;


private static


Logger



logger



= Logger.

getLogger

(DailyScheduledJob.


class


)


;



protected void


executeInternal


(JobExecutionContextcontext)


throws


JobExecutionException{




//


平台控制开关




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配置


<bean


id


=”dailyTask”




class


=”org.springframework.scheduling.quartz.JobDetailFactoryBean”


>


<property


name


=”jobClass”


value


=”com.google.busi.schedule.DailyScheduledJob”


/>


<property


name


=”durability”


value


=”true”


/>


<property


name


=”jobDataMap”


>


<map>


<entry


key


=”contextUtil”


value-ref


=”applicationContextUtil”


/>




<!–


定时任务执行开关


–>




<entry


key


=”isOpen”


value


=”${googles.schedule.isopen}”


/>


</map>


</property>


</bean>


<bean


id


=”inquiryCronTrigger”


class


=”com.google.busi.schedule.InitCronTriggerFactoryBean”


>


<property


name


=”jobDetail”


ref


=”dailyTask”


/>




<!– <property name=”key”value=”inquiryQuartzParam” /> –>




<property


name


=”baseConfigService”


ref


=”baseConfigService”


/>


</bean>


<bean


id


=”schedulerFactoryBean”




class


=”org.springframework.scheduling.quartz.SchedulerFactoryBean”


>


<property


name


=”triggers”


>


<list>


<ref


bean


=”inquiryCronTrigger”


/>


<ref


bean


=”cronTrigger”


/>


</list>


</property>


</bean>

三:项目启动时从数据库读取cron表达式,初始化Trigger

这里记得setName



/**



*


服务器启动时,从


baseConfig


读取配置文件配置的时间





*

@author

Administrator



*



*/


public class


InitCronTriggerFactoryBean


extends


CronTriggerFactoryBean


implements


Serializable {





//private static final longserialVersionUID = 1L;




private static final long



serialVersionUID



= –


5937544121329980033L


;



public static final


String



SUBS_NOPAY_TRIGGER



=


“SUBS_NOPAY_TRIGGER”


;



private


IBaseConfigService


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 =


new


String()


;


return


DateUtil.

parseExpression

(Integer.

valueOf

(


baseConfigService


.loadBaseConfigByKey(Constants.



NOPAY_SUBS_AGE



).getConfigValue())/


60


)


;




}




}

四:动态设置cron表达式的接口和实现类

接口


package


com.google.busi.service.intf.busi


;



import


java.util.Date


;



import


org.quartz.CronExpression


;




public interface


ISchedulerService {





/**



*


根据


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




版权声明:本文为jianging2009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。