2012-10-25 57 views
1

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

我的配置现在看起来像这样:提前

<!-- 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> 

感谢您的帮助球员。

回答

0

可能为最简单的办法是,子类CronTriggerBean和实施一个覆盖setCronExpression(..)方法,你去哪里了数据库数据库属性的分辨率,获取所需的cron,并调用super.setCronExpression(dbValue)

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

+0

点我一下,我需要实现这个加石英调度豆?我的MarketStatusJob类有一个metod execute();我将在那里为我的工作写我的代码。 – Denees

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); 

您可以在上下文中

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