实现定时任务,包括修改执行策略,用quartz+Spring

来源:互联网 发布:软件著作权网上公示 编辑:程序博客网 时间:2024/05/16 00:51
来源于网络 http://www.blogjava.net/xiaodaoxiaodao/articles/103437.html给出完整的类和配置文件,除了一般是Spring 包外,另外需要下一个包spring-context-1.15.jar包,可在http://repo1.maven.org/maven2/ 找。下面的内容拼到一个webProject里面,发布起来就可以看到效果。1.Actionpublic 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.Beanpublic class ScheduleInfo {String cronExpression="0/10 * * * * ?";public void setCronExpression(String cronExpression) {this.cronExpression = cronExpression;}public String getCronExpression(){return this.cronExpression ;}}3.Servicepublic 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.Initpublic 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 blocke.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