0

CronTriggerBeanを使用して、2つの異なるアクションを呼び出すための2つのトリガー(トリガーAとBなど)を作成しました。プロジェクトを.warとして2台のサーバーに配置しました。クラスタリングにJobStoreTXを使用しています。私が直面している問題は、1つのトリガーのみをクラスター化したいということです。つまり、AとトリガーBはクラスター化されるべきではありません。どのトリガーをクラスター化する必要があるかをコードで指定する方法はありますか?私のコードは以下のように進みます。

<bean id="shedulerJobStoreTX" class="org.quartz.impl.jdbcjobstore.JobStoreTX>
  <property name="driverDelegateClass" value="org.quartz.impl. jdbcjobstore.oracle.OracleDelegate">
<property name="dataSource" value ="jndiDS"/>
        <property name="tablePrefix" value="someschemaName"/>
        <property name="isClustered" value="true"/>
<property name="clusterCheckinInterval" value="${someValue}"/>
    </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">       
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
                <ref bean="clusterCronTrigger"/>
            </list>
        </property>
    </bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runAppJob" />
        <property name="cronExpression" value="${someTimeValue1}"/>
    </bean>
    <bean id="clusterCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runClusterJob" />
        <property name="cronExpression" value="${someTimeValue2}"/>
    </bean>

こんにちは、私はコードを改良しましたが、上記の問題は発生していません。同じコードをPFBします。

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
                <list>
                    <ref bean="cronTrigger" />
                    <ref bean="clusterCronTrigger"/>
                </list>
            </property>
            <property name="quartzProperties">
            <props>
              <prop key="org.quartz.jobStore.isClustered">false</prop> 
              <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
              <prop key ="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.
   JobStoreTX </prop> 
              <prop key="org.quartz.jobStore.tablePrefix">schemaName</prop> 
              <prop key="org.quartz.jobStore.driverDelegateClass"> org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop> 
              <prop key="org.quartz.jobStore.selectWithLockSQL"> SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME= ?</prop>
            </props>
            </property>
            <property name="dataSource" ref="fsmJndiDataSource"/> 

しかし、上記のコードを実行する際の問題は、クォーツがロックを取得しようとしたときに以下の例外が発生することです... " initメソッドの呼び出しに失敗しました。ネストされた例外はorg.quartz.SchedulerConfigExceptionです:ジョブの回復中に失敗が発生しました。 [ネストされた例外を参照してください:org.quartz.impl.jdbcjobstore.LockException:db行ロックの取得に失敗しました:ORA-00942:テーブルまたはビューが存在しません"

4

2 に答える 2

3

スケジューラを実行する前に、データベースに必要なクォーツテーブルを作成する必要があります。

デフォルトのクォーツテーブルのSQLスクリプトは、\ docs\dbTablesで入手できます。

たとえば、quartz 2.2.1ディストリビューションを使用している場合(quartz-2.2.1-distribution.tar \ quartz-2.2.1 \ docs \ dbTables \ Tables_oracle)

データベースでSQLスクリプトを実行し、その中に作成されたテーブルが下の画像を参照していることを確認します

ここに画像の説明を入力してください

于 2015-10-13T12:06:33.743 に答える
0

「ORA-00942:テーブルまたはビューが存在しません」というメッセージが原因で、テーブル「schemaNameLOCKS」が欠落していると思います。確かに、ドキュメントから:

org.quartz.jobStore.selectWithLockSQL

「LOCKS」テーブルの行を選択し、その行にロックをかけるSQL文字列である必要があります。設定されていない場合、デフォルトは「SELECT * FROM {0} LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME =?FOR UPDATE」であり、ほとんどのデータベースで機能します。"{0}"は、実行時に上記で構成したTABLE_PREFIXに置き換えられます。「{1}」はスケジューラーの名前に置き換えられます。

于 2012-09-10T14:23:35.037 に答える