5

クラスター化されたセットアップ (JDBC データストアを使用) で、Spring 3.1 で Quartz 2.1.6 を使用しているときに問題に直面しています。現在のコンテキスト:

  • ジョブと CRON トリガーは、Spring 構成ファイルで定義されます (以下を参照)。
  • SchedulerFactoryBean で overwriteExistingJobs プロパティが 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>
4

1 に答える 1

5

各トリガーの Bean 定義に「 name」属性がありませんでした。したがって、Spring の CronTriggerFactory は、展開ごとに新しいトリガー名を動的に生成していました。これが、相加効果を引き起こした理由です (異なる名前のトリガーは上書きされません)。

各トリガー定義に一意の値を持つname="..."を追加すると、問題が解決しました。

于 2013-02-20T21:58:33.047 に答える