使用Quartz动态调度作业

时间:2012-10-25 10:46:01

标签: java spring quartz-scheduler

我在Spring中实现了一个Scheduled Job,我正在使用带有Hibernate和Struts2的Spring 3.1.1。配置工作正常,但我想动态更改de cron,所以我找到了几个例子,但我无法实现它们,到处都是不同的配置,我只需要从数据库中读取cron值而不是配置文件。这有可能吗?

我的配置现在看起来像是:

<!-- Scheduler Tasks -->
<bean name="statTask" class="com.bvc.spring.schedulers.MarketStatusJob"></bean>

<!-- Scheduler jobs -->
<bean id="statJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="statTask" />
    <property name="targetMethod" value="execute" />
</bean>

<!-- Cron Triggers -->
<bean id="statCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="statJobDetail" />
    <property name="cronExpression" value="0 30 12 1/1 * ? *"/>
</bean>

<!-- Triggers -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="statCronTrigger"/>
        </list>
    </property>
</bean>

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

可能最简单的方法是,将CronTriggerBean子类化并在重写的setCronExpression(..)方法中实现数据库属性解析,然后转到数据库,获取所需的cron,并调用{{1} }

另一种更难的方法是实现从数据库而不是属性文件中读取它们的super.setCronExpression(dbValue)。但这可能不是微不足道的。对此没有支持,因为从属性文件中读取值更为习惯。另请注意,您将无法在执行期间动态更改cron。

答案 1 :(得分:0)

您不需要拥有statCronTrigger,需要在主类中实现石英触发器 工作细节很好。

    CronTrigger trigger = null;
    JobDetail jobD;


    //Load context
    ApplicationContext context = new ClassPathXmlApplicationContext("YOUR_CONTEXT_FILES.xml");

    //Setup JobDetail

    jobD = (JobDetail) context.getBean("statJobDetail");

    //Setup CronTrigger
    try {
        trigger = new CronTrigger();
        trigger.setName("AppTrigger");
        trigger.setGroup(jobD.getGroup());
        trigger.setJobName(jobD.getName());
        trigger.setJobGroup(jobD.getGroup());
        trigger.setCronExpression("*/10 * * * * ?");// you can read this from DB as well or any other configured string 

    } catch (ParseException e1) {
        e1.printStackTrace();
    }

    //Scheduler
try{

        Scheduler scheduler =  (Scheduler) context.getBean("Scheduler");
        scheduler.scheduleJob(jobD, trigger);

您可以在上下文中添加quartz scheduler bean

  <bean id="Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"></bean>