2013-02-20 2 views
4

클러스터 된 설정 (JDBC 데이터 저장소 포함)에서 Quartz 2.1.6과 Spring 3.1을 사용하는 중에 문제가 발생합니다. 현재 상황 :쿼츠 클러스터링 - 서버가 시작될 때 중복 된 트리거

    잡스와 CRON 트리거는 스프링 설정 파일에 정의되어
  • overwriteExistingJobs 속성의 SchedulerFactoryBean에 true로 설정되어
  • (아래 참조), 그래서 우리는 DB에 추가 된 새 작업 정의를하지 않습니다 각 배포마다.
  • 그러나 클러스터에 배포 한 후에는 각 노드가 트리거 데이터를 다시 만드는 것처럼 보입니다. 예를 들어, 1 개의 작업과 4 개의 노드를 가리키는 트리거가 2 개있는 경우 클러스터 배포 후에 DB에 1 개의 작업 정의와 4x2 트리거가 있습니다. 각각의 재배포는 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는 각 배포에서 새로운 트리거 이름을 동적으로 생성하므로 추가 효과 (다른 이름을 가진 트리거를 덮어 쓰지 않음)가 발생했습니다.

이름 = "..."을 각 트리거 정의에 고유 값으로 추가하면 문제가 해결됩니다.

+0

명확히하기 :'SimpleTriggerBean'은'name' properrty 세트를 필요로합니다. – Thomas

관련 문제