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配置
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
三:项目启动时从数据库读取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(String name,String group,String cronExpression);
/**
*根据 Quartz Cron Expression调试任务
*
*@param cronExpression
* Quartz CronExpression
*/
void schedule(CronExpression cronExpression);
/**
*根据 Quartz Cron Expression调试任务
*
*@param name
* Quartz CronTrigger名称
* @param cronExpression
* Quartz CronExpression
*/
void schedule(String name,CronExpression cronExpression);
/**
*根据 Quartz Cron Expression调试任务
*
*@param name
* Quartz CronTrigger名称
* @param group
* Quartz CronTrigger组
* @param cronExpression
* Quartz CronExpression
*/
void schedule(String name,String group,CronExpression cronExpression);
/**
*在startTime时执行调试一次
*
*@param startTime
* 调度开始时间
*/
void schedule(Date startTime);
voidschedule(Date startTime,String group);
/**
*在startTime时执行调试一次
*
*@param name
* Quartz SimpleTrigger 名称
* @param startTime
* 调度开始时间
*/
void schedule(String name,Date startTime);
voidschedule(String name,Date startTime,String group);
/**
*在startTime时执行调试,endTime结束执行调度
*
*@param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
*/
void schedule(Date startTime,Date endTime);
voidschedule(Date startTime,Date endTime,String group);
/**
*在startTime时执行调试,endTime结束执行调度
*
*@param name
* Quartz SimpleTrigger 名称
* @param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
*/
void schedule(String name,Date startTime,Date endTime);
voidschedule(String name,Date startTime,Date endTime,String group);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
*
*@param startTime
* 调度开始时间
* @param repeatCount
* 重复执行次数
*/
void schedule(Date startTime, intrepeatCount);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
*
*@param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
* @param repeatCount
* 重复执行次数
*/
void schedule(Date startTime,Date endTime, intrepeatCount);
voidschedule(Date startTime,Date endTime, intrepeatCount,String group);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次
*
*@param name
* Quartz SimpleTrigger 名称
* @param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
* @param repeatCount
* 重复执行次数
*/
void schedule(String name,Date startTime,Date endTime, intrepeatCount);
voidschedule(String name,Date startTime,Date endTime, intrepeatCount,String group);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
*
*@param startTime
* 调度开始时间
*
*@param repeatCount
* 重复执行次数
* @param repeatInterval
* 执行时间隔间
*/
void schedule(Date startTime, intrepeatCount, longrepeatInterval);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
*
*@param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
* @param repeatCount
* 重复执行次数
* @param repeatInterval
* 执行时间隔间
*/
void schedule(Date startTime,Date endTime, intrepeatCount, longrepeatInterval);
voidschedule(Date startTime,Date endTime, intrepeatCount, longrepeatInterval,String group);
/**
*在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,每隔repeatInterval秒执行一次
*
*@param name
* Quartz SimpleTrigger 名称
* @param startTime
* 调度开始时间
* @param endTime
* 调度结束时间
* @param repeatCount
* 重复执行次数
* @param repeatInterval
* 执行时间隔间
*/
void schedule(String name,Date startTime,Date endTime, intrepeatCount, longrepeatInterval);
voidschedule(String name,Date startTime,Date endTime, intrepeatCount, longrepeatInterval,String group);
/**
*暂停触发器
*
*@param triggerName
* 触发器名称
*/
void pauseTrigger(String triggerName);
/**
*暂停触发器
*
*@param triggerName
* 触发器名称
* @param group
* 触发器组
*/
void pauseTrigger(StringtriggerName,String group);
/**
*恢复触发器
*
*@param triggerName
* 触发器名称
*/
void resumeTrigger(String triggerName);
/**
*恢复触发器
*
*@param triggerName
* 触发器名称
* @param group
* 触发器组
*/
void resumeTrigger(String triggerName,String group);
/**
*删除触发器
*
*@param triggerName
* 触发器名称
* @return
*/
boolean removeTrigdger(String triggerName);
/**
*删除触发器
*
*@param triggerName
* 触发器名称
* @param group
* 触发器组
* @return
*/
boolean removeTrigdger(String triggerName,String group);
}
实现类
packagecom.google.busi.service.impl.busi;
importjava.text.ParseException;
importjava.util.*;
importorg.quartz.*;
importorg.quartz.Scheduler;
importorg.quartz.impl.triggers.CronTriggerImpl;
importorg.quartz.impl.triggers.SimpleTriggerImpl;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.beans.factory.annotation.Qualifier;
importorg.springframework.stereotype.Service;
importcom.google.busi.service.intf.busi.ISchedulerService;
importorg.springframework.transaction.annotation.Transactional;
importjavax.annotation.PostConstruct;
@Service("schedulerService")
public classSchedulerServiceImpl implementsISchedulerService {
private static final StringNULLSTRING =null;
private static finalDate NULLDATE= null;
@Autowired(required=false)
private Scheduler scheduler;
@Autowired(required=false)
@Qualifier("dailyTask")
private JobDetail jobDetail;
@Override
public void schedule(String cronExpression) {
schedule(NULLSTRING,cronExpression);
}
@Override
public void schedule(String name,String cronExpression) {
schedule(name,NULLSTRING,cronExpression);
}
@Override
public void schedule(String name,String group,String cronExpression) {
try {
schedule(name,group, new CronExpression(cronExpression));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public void schedule(CronExpression cronExpression) {
schedule(NULLSTRING,cronExpression);
}
@Override
public void schedule(String name,CronExpression cronExpression) {
schedule(name,NULLSTRING,cronExpression);
}
@Override
public void schedule(String name,String group,CronExpression cronExpression) {
if (isValidExpression(cronExpression)){
if (name ==null || name.trim().equals("")) {
name = UUID.randomUUID().toString();
}
CronTriggerImpl trigger=new CronTriggerImpl();
trigger.setCronExpression(cronExpression);
TriggerKey triggerKey = newTriggerKey(name,group);
trigger.setJobName(jobDetail.getKey().getName());
trigger.setKey(triggerKey);
try{
scheduler.addJob(jobDetail, true);
if(scheduler.checkExists(triggerKey)){
scheduler.rescheduleJob(triggerKey,trigger);
} else {
scheduler.scheduleJob(trigger);
}
}catch (SchedulerExceptione) {
throw new IllegalArgumentException(e);
}
}
}
@Override
public void schedule(Date startTime) {
schedule(startTime,NULLDATE);
}
@Override
public void schedule(Date startTime,String group) {
schedule(startTime,NULLDATE,group);
}
@Override
public void schedule(String name,Date startTime) {
schedule(name,startTime, NULLDATE);
}
@Override
public void schedule(String name,Date startTime,String group) {
schedule(name,startTime, NULLDATE,group);
}
@Override
public void schedule(Date startTime,Date endTime) {
schedule(startTime,endTime, 0);
}
@Override
public void schedule(Date startTime,Date endTime,String group) {
schedule(startTime,endTime, 0, group);
}
@Override
public void schedule(String name,Date startTime,Date endTime) {
schedule(name,startTime, endTime, 0);
}
@Override
public void schedule(String name,Date startTime,Date endTime,String group) {
schedule(name,startTime, endTime, 0,group);
}
@Override
public void schedule(Date startTime, intrepeatCount) {
schedule(null,startTime, NULLDATE,0);
}
@Override
public void schedule(Date startTime,Date endTime, intrepeatCount) {
schedule(null,startTime, endTime, 0);
}
@Override
public void schedule(Date startTime,Date endTime, intrepeatCount,String group) {
schedule(null,startTime, endTime, 0,group);
}
@Override
public void schedule(String name,Date startTime,Date endTime, intrepeatCount) {
schedule(name,startTime, endTime, 0,0L);
}
@Override
public void schedule(String name,Date startTime,Date endTime, intrepeatCount,String group) {
schedule(name,startTime, endTime, 0,0L, group);
}
@Override
public void schedule(Date startTime, intrepeatCount, longrepeatInterval) {
schedule(null,startTime, NULLDATE,repeatCount,repeatInterval);
}
@Override
public void schedule(Date startTime,Date endTime, intrepeatCount, longrepeatInterval) {
schedule(null,startTime, endTime, repeatCount,repeatInterval);
}
@Override
public void schedule(Date startTime,Date endTime, intrepeatCount, longrepeatInterval,String group) {
schedule(null,startTime, endTime, repeatCount,repeatInterval,group);
}
@Override
public void schedule(String name,Date startTime,Date endTime, intrepeatCount, longrepeatInterval) {
schedule(name,startTime, endTime, repeatCount,repeatInterval,NULLSTRING);
}
@Override
public void schedule(String name,Date startTime,Date endTime, intrepeatCount, longrepeatInterval,String group) {
if (this.isValidExpression(startTime)) {
if (name ==null || name.trim().equals("")) {
name = UUID.randomUUID().toString();
}
TriggerKey triggerKey =new TriggerKey(name,group);
SimpleTriggerImpl trigger = newSimpleTriggerImpl();
trigger.setKey(triggerKey);
trigger.setJobName(jobDetail.getKey().getName());
trigger.setStartTime(startTime);
trigger.setEndTime(endTime);
trigger.setRepeatCount(repeatCount);
trigger.setRepeatInterval(repeatInterval);
try{
scheduler.addJob(jobDetail, true);
if(scheduler.checkExists(triggerKey)){
scheduler.rescheduleJob(triggerKey,trigger);
} else {
scheduler.scheduleJob(trigger);
}
}catch (SchedulerExceptione) {
throw new IllegalArgumentException(e);
}
}
}
@Override
public void pauseTrigger(String triggerName) {
pauseTrigger(triggerName,NULLSTRING);
}
@Override
public void pauseTrigger(String triggerName,String group){
try {
scheduler.pauseTrigger(newTriggerKey(triggerName,group));//停止触发器
} catch (SchedulerException e) {
throw newRuntimeException(e);
}
}
@Override
public void resumeTrigger(String triggerName) {
resumeTrigger(triggerName,NULLSTRING);
}
@Override
public void resumeTrigger(String triggerName,String group){
try {
scheduler.resumeTrigger(newTriggerKey(triggerName,group));//重启触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean removeTrigdger(String triggerName) {
return removeTrigdger(triggerName,NULLSTRING);
}
@Override
public boolean removeTrigdger(String triggerName,String group){
TriggerKey triggerKey =new TriggerKey(triggerName,group);
try{
scheduler.pauseTrigger(triggerKey);//停止触发器
return scheduler.unscheduleJob(triggerKey);//移除触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
private boolean isValidExpression(finalCronExpressioncronExpression) {
CronTriggerImpl trigger =new CronTriggerImpl();
trigger.setCronExpression(cronExpression);
Date date =trigger.computeFirstFireTime(null);
returndate != null&&date.after(newDate());
}
private boolean isValidExpression(finalDate startTime){
SimpleTriggerImpl trigger =new SimpleTriggerImpl();
trigger.setStartTime(startTime);
Date date =trigger.computeFirstFireTime(null);
returndate != null&&date.after(newDate());
}
}
五:动态设置cron表达式
/**
*设置订单清理时间
*/
@PutMapping(value= "/age")
@ResponseBody
public String setSubsNoPayAge(@RequestBodyReqEntity reqEntity) {
try {
JSONObject reqBody =reqEntity.getReqBody();
Integer age = reqBody.getInteger("age")/1;
ISchedulerService schedulerService =ApplicationContextUtil.getBean("schedulerService",ISchedulerService.class);
schedulerService.schedule(InitCronTriggerFactoryBean.SUBS_NOPAY_TRIGGER,DateUtil.parseExpression(age));
if(age >0) {
age = age*60;//分钟转化为秒
BaseConfig baseConfig = newBaseConfig();
baseConfig.setConfigId(Constants.NOPAY_SUBS_AGE);
baseConfig.setConfigValue(age.toString());
baseConfigService.updateBaseConfig(baseConfig);
}
return WebUtil.formatResponseParams(CodeDefine.EXEC_OK, null,baseCodeService);
} catch(Exception e) {
logger.error("订单发货失败!",e);
returnWebUtil.formatResponseParams(CodeDefine.SERVER_ERROR, null,baseCodeService);
}
}