2013-02-20 30 views
4

在集羣設置(使用JDBC數據存儲)中,對Spring 3.1使用Quartz 2.1.6時,我們遇到了一個問題。 當前環境:Quartz Clustering - 在服務器啓動時複製觸發器

  • 喬布斯和cron觸發器在spring配置文件中定義(見下文)
  • overwriteExistingJobs屬性設置爲true的SchedulerFactoryBean,所以我們沒有得到添加到數據庫的新作業定義每次部署。
  • 但是,在集羣中的每次部署之後,似乎每個節點都會重新創建觸發器數據。例如,如果我們有2個觸發器指向1個作業和4個節點,那麼在集羣部署之後,DB有1個作業定義和4個2個觸發器。每次重新部署添加4x2觸發器。

此舉是否正常?如果是的話:我們如何告訴Quartz不要在每個部署中重新創建觸發器數據? (或覆蓋數據,與喬布斯)

<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> 
    <property name="jobClass" value="com.etc.MyJob" /> 
</bean> 
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" 
    p:waitForJobsToCompleteOnShutdown="false" lazy-init="false"> 

    <property name="dataSource" ref="myDataSource" /> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="overwriteExistingJobs" value="true" /> 
    <property name="autoStartup" value="true" /> 
    <property name="jobFactory"> 
       <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/> 
      </property> 
    <property name="triggers"> 
     <list> 
      <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:cronExpression="0 0 0 * * ?"     p:misfireInstruction="2"> 
       <property name="jobDetail" ref="myJob" /> 
      </bean> 
      <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean " 
       p:cronExpression="0 0 20 * * ?" 
       p:misfireInstruction="2"> 
       <property name="jobDetail" ref="myJob" /> 
      </bean> 
     </list> 
    </property> 
    <property name="quartzProperties"> 
     <props> 
      <prop key="org.quartz.scheduler.instanceName">fsbu_scheduler</prop> 
      <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 

      <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> 
      <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
      <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate 
      </prop> 
      <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE 
      </prop> 
      <prop key="org.quartz.jobStore.tablePrefix">fsqrz_</prop> 
      <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop> 
      <prop key="org.quartz.jobStore.isClustered">true</prop> 
      <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
      <prop key="org.quartz.threadPool.threadCount">3</prop> 
      <prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin 
      </prop> 
      <prop key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger {1}.{0} fired job {6}.{5} at {4, date, 
       yyyy-MM-dd HH:mm:ss} 
      </prop> 
      <prop key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0} completed firing job {6}.{5} at {4, 
       date, yyyy-MM-dd HH:mm:ss} with resulting trigger instruction code 
       {9} 
      </prop> 
     </props> 
    </property> 
</bean> 

回答

5

的bean定義爲每個觸發沒有足夠的「」屬性。因此,Spring的CronTriggerFactory動態地爲每個部署生成一個新的觸發器名稱,這就是爲什麼這會產生疊加效應(不同名稱的觸發器不會被覆蓋)的原因。

加入name =「...」爲每個觸發器定義的唯一值解決了問題。

+0

澄清:'SimpleTriggerBean'需要設置'name'屬性。 – Thomas 2013-08-28 03:09:03

相關問題