2012-10-25 40 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>