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