3

Spring を使用する Weblogic で Quartz 1.6.6 を使用する Java アプリケーションがいくつかあります (1 つは Spring v. 2.5.4 を使用し、もう 1 つは Spring v. 3.1.1 を使用します)。私のアーキテクチャには、Weblogic クラスタ内に 2 つのアプリケーション サーバーがあります。

両方のアプリケーションには、単純なトリガーが設定されています (org.springframework.scheduling.quartz.SchedulerFactoryBeanorg.springframework.scheduling.quartz.SimpleTriggerBeanを使用org.springframework.scheduling.quartz.JobDetailBean)。これらはすべて 60 秒ごとに実行されるように設定されています。

org.springframework.scheduling.quartz.QuartzJobBean関連する(メソッドの開始時)にログを追加しましたexecuteInternal()。これは、プロセスが実行された時刻を書き込みます。

私が見つけたのは、時間が一貫していないということです。特定の分の実行が行われないことがあります。例:

アプリケーション 1 には、次の時点で実行された 1 つのトリガー プロセスがあります。

14:26:26,098
14:28:26,089
14:31:26,096
14:33:26,093
14:35:26,095
14:36:26,098
14:38:26,103

アプリケーション 2 には、次の時点で実行された 2 つのトリガー プロセスがあります。

14:40:05,951 (trigger 1)
14:41:05,951 (trigger 2)
14:42:05,943 (trigger 1)
14:43:05,954 (trigger 2)
14:44:05,937 (trigger 1)
14:45:05,956 (trigger 2)
14:46:05,953 (trigger 2)
14:47:05,937 (trigger 1)
14:48:05,941 (trigger 1)
14:49:05,939 (trigger 1)
14:50:05,951 (trigger 2)

1 つの Weblogic アプリケーション サーバーをオフにすると、両方のアプリケーションが毎分すべてのジョブを問題なく実行します。

すべてのジョブのデータベース テーブルを確認しましたQRTZ_SIMPLE_TRIGGERS.REPEAT_INTERVALが、正しいです (60,000 ミリ秒)。QRTZ_TRIGGERS.PREV_FIRE_TIMEとの差QRTZ_TRIGGERS.NEXT_FIRE_TIMEも 60,000 です。

アプリケーション コンテキスト ファイルの私のquartzProperties定義には、次のエントリがあります。

<property name="quartzProperties">
    <props>
        <prop key="org.quartz.scheduler.instanceName">MyClusteredScheduler</prop>
        <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
        <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
        <prop key="org.quartz.threadPool.threadCount">5</prop>
        <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
        <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
        <prop key="org.quartz.jobStore.isClustered">true</prop>
        <prop key="org.quartz.jobStore.clusterCheckinInterval">5000</prop>
        <prop key="org.quartz.jobStore.dataSource">myDS</prop>
        <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
        <prop key="org.quartz.dataSource.myDS.driver">oracle.jdbc.driver.OracleDriver</prop>
        <prop key="org.quartz.dataSource.myDS.URL">{db connection string}</prop>
        <prop key="org.quartz.dataSource.myDS.user">{username}</prop>
        <prop key="org.quartz.dataSource.myDS.password">{password}</prop>
        <prop key="org.quartz.dataSource.myDS.maxConnections">5</prop>
        <prop key="org.quartz.dataSource.myDS.validationQuery">select 0 from dual</prop>
    </props>
</property>

なぜこれが必要なのかについて何か考えはありますか?前もって感謝します。

4

1 に答える 1

0

一見修正されたように見えます: この問題は、Quartz との関係よりも、一貫性のないトリガー時間を示唆する一貫性のないログ メッセージへの依存に関係していました。

于 2012-07-27T03:28:58.460 に答える