Quartz动态改变Cron表达式,来实现动态执行Spring定时任务
2017-01-04 16:04
513 查看
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(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);
}
}
这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值。
每次想改变表达式的值的时候手动修改配置文件中的表达式,实现动态表达式。
一:定时调度任务
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(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);
}
}
相关文章推荐
- 动态改变Cron表达式,来实现动态执行Spring定时任务
- 关于quartz cron表达式饭解析验证输出实现部分截图代码
- Quartz Cron表达式 每周、每月执行一次
- Quartz 用 cron 表达式存放执行计划
- Quartz动态添加、修改和删除定时任务时间的方法以及日期转换cron表达式时间格式工具类
- Spring+Quartz实现定时任务的配置方法--Cron表达式解释
- Quartz实现定时功能,Cron表达式调度等等
- Quartz Cron表达式 每周、每月执行一次
- 动态修改参数cron的值来实现Spring自带定时器动态的执行任务
- java监听器+quartz实现每天动态时间执行任务的功能
- Quartz 框架和cron表达式任务调度的例子(spring下实现定时发送邮件)
- Quartz 用 cron 表达式存放执行计划
- spring中轻松实现定时任务,quartz表达式的在线Cron表达式生成器推荐
- Quartz-Cron表达式统计最近几次的执行时间
- Quartz的cron表达式参考
- 使用JavaScript实现动态改变控件大小
- 关于调用Spring设置Quartz中动态执行时间解决办法
- 飘逸的Groovy,利用Groovy+windows执行计划 实现动态RunstatusDb2数据库
- 动态改变DataWindow控件窗口中内容的几种实现方法
- Quartz的cron表达式参考