2010-05-18 184 views
2

在彈簧servlet xml文件中,我使用org.springframework.scheduling.quartz.SchedulerFactoryBean來定期觸發一組觸發器。在配置時更改spring bean屬性

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <list> 
      <ref local="AwesomeTrigger" /> 
      <ref local="GreatTrigger" /> 
      <ref local="FantasticTrigger"/> 
     </list> 
    </property> 
</bean> 

問題是,在不同的環境中,我不希望某些觸發器觸發。有沒有辦法在我的build.properties中定義一些配置或變量,或者定義一個spring自定義上下文屬性文件來幫助bean xml確定哪些觸發器應該包含在列表中?那樣,例如,AwesomeTrigger將在開發中被調用,但不是qa。

回答

4

創建工廠bean,基於屬性

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
     <bean class="com.yourcompany.FactoryBeanThatReturnsAListOfTriggers"> 
      <property name="triggerNames" value="${some.property}" /> 
     </bean> 

    </property> 
</bean> 

<context:property-placeholder location="classpath:your.properties" /> 

參考返回觸發器的列表:

2

我有同樣的問題。

我所做的:

我推翻觸發豆添加啓用的屬性。

而且我覆蓋SchedulerFactoryBean.setTriggers後,我只設置啓用的觸發器。

您只需要在xml文件中使用這些新的bean,並在您的屬性文件中啓用。

例:

public void setTriggers(Trigger[] triggers) { 
     ArrayList<Trigger> triggersToSchedule = new ArrayList<Trigger>(); 

     for(Trigger trigger : triggers){ 
      if(trigger instanceof SimpleTriggerBeanEnabler){ 
       if(((SimpleTriggerBeanEnabler)(trigger)).isEnabled()){ 
        triggersToSchedule.add(trigger); 
       } 
      } 
      else{ 
       triggersToSchedule.add(trigger); 
      } 
     } 


     super.setTriggers(triggersToSchedule.toArray(new Trigger[triggersToSchedule.size()])); 
    }