来源于网络 http://www.blogjava.net/xiaodaoxiaodao/articles/103437.html
给出完整的类和配置文件,除了一般是Spring 包外,另外需要下一个包spring-context-1.15.jar包,可在http://repo1.maven.org/maven2/ 找。
下面的内容拼到一个webProject里面,发布起来就可以看到效果。
1.Action
public class ScheduleInfoAction {
public void reScheduleJob() throws SchedulerException, ParseException {
// 运行时可通过动态注入的scheduler得到trigger
CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
"cronTrigger", Scheduler.DEFAULT_GROUP);
String dbCronExpression = getCronExpressionFromDB();
String originConExpression = trigger.getCronExpression();
// 判断从DB中取得的任务时间(dbCronExpression)和现在的quartz线程中的任务时间(originConExpression)是否相等
// 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
if(!originConExpression.equalsIgnoreCase(dbCronExpression)){
trigger.setCronExpression(dbCronExpression); //执行更新操作
scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);
}
// 下面是具体的job内容,可自行设置
executeJobDetail();
}
private String getCronExpressionFromDB(){
String sql="from ScheduleInfo scheduleInfo where 1=1 ";
sql=sql+" and scheduleInfo.infoId = '"+"1" + "'";
List scheduleList = scheduleInfoManager.queryScheduleInListBySql(sql);
ScheduleInfo scheduleInfo = (ScheduleInfo)scheduleList.get(0);
String dbCronExpression = scheduleInfo.getCronExpression();
return dbCronExpression;
}
private void executeJobDetail(){
System.out.println("schedule action time:"+System.currentTimeMillis());
}
private Scheduler scheduler;
// 设值注入,通过setter方法传入被调用者的实例scheduler
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
private ScheduleInfoManager scheduleInfoManager;
// 设值注入,通过setter方法传入被调用者的实例scheduleInfoManager
public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager){
this.scheduleInfoManager = scheduleInfoManager;
}
}
2.Bean
public class ScheduleInfo {
String cronExpression="0/10 * * * * ?";
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public String getCronExpression(){
return this.cronExpression ;
}
}
3.Service
public class ScheduleInfoManager {
long i =System.currentTimeMillis();
int j=0;
List lis=new ArrayList();
ScheduleInfo s=new ScheduleInfo();
public List queryScheduleInListBySql(String sql){
if(System.currentTimeMillis()-i<30*1000 ){
}else if(j==0){
j++;
s.setCronExpression("0 * * * * ?");
System.out.println("30秒到,更新参数:0 * * * * ?");
}
lis.add(s);
return lis;
}
}
4.Init
public class InitializingCronTrigger extends CronTriggerBean implements Serializable {
private ScheduleInfoManager scheduleInfoManager;
// 设值注入,通过setter方法传入被调用者的实例scheduleInfoManager
public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager){
this.scheduleInfoManager = scheduleInfoManager;
// 因为在getCronExpressionFromDB使用到了scheduleInfoManager,所以
// 必须上一行代码设置scheduleInfoManager后进行getCronExpressionFromDB
String cronExpression = getCronExpressionFromDB (); // ①
// 因为extendsCronTriggerBean ,此处调用父类方法初始化cronExpression
try {
setCronExpression (cronExpression);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // ②
}
private String getCronExpressionFromDB(){
String sql="from ScheduleInfo scheduleInfo where 1=1 ";
sql=sql+" and scheduleInfo.infoId = '"+"1" + "'";
List scheduleList = scheduleInfoManager.queryScheduleInListBySql(sql);
ScheduleInfo scheduleInfo = (ScheduleInfo)scheduleList.get(0);
String dbCronExpression = scheduleInfo.getCronExpression();
System.out.println("inital:"+dbCronExpression);
return dbCronExpression;
}
5.applicationcontext.xml