`
xly1981
  • 浏览: 142738 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Quartz实现定时的DEMO,可修改定时策略

阅读更多
来源于网络 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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="scheduleInfoManager" class="com.huateng.quartz.ScheduleInfoManager">
    </bean>
   
<bean id="scheduleInfoAction" class="com.huateng.quartz.ScheduleInfoAction">
<property name="scheduler" ref="schedulerFactory"/>
        <property name="scheduleInfoManager" ref="scheduleInfoManager"/>
    </bean>

    <bean id="schedulerJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="scheduleInfoAction"/>
        <property name="targetMethod" value="reScheduleJob"/>
        <property name="concurrent" value="false"/>
    </bean>

     <bean id="cronTrigger" class="com.huateng.trigger.InitializingCronTrigger">
         <property name="jobDetail" ref="schedulerJobDetail"/>
         <!--<property name="cronExpression">
             <value>0/10 * * * * ?</value>
         </property>-->
         <property name="scheduleInfoManager" ref="scheduleInfoManager"/>
     </bean>

    <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref local="cronTrigger"/>
            </list>
        </property>
</bean>
</beans>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics