1

XML Scheduling Plugin ( ) を使用して、 XMLSchedulingDataProcessorPluginJDBC ジョブ ストアで起動時にいくつかのジョブとトリガーを作成しています。これは問題なく動作しますが、一度だけ実行するように構成された単純なトリガーに問題があります。

このようなトリガーが起動すると、次の起動時間がないため、データベースから削除されます。ここまでは順調ですね。残念ながら、アプリケーションを再起動すると、プラグインはそのトリガーを見つけることができないため、再度挿入されます。私はMISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICYこのジョブを使用しているため、データベースから何度も削除されます。アプリケーションを再起動すると、プロセス全体が繰り返されます。

明らかに、トリガーを1回だけ起動したいです。次の起動時間がなくても、起動されたトリガーをデータベースに保持することは可能ですか? それとも、これは別の方法で解決できますか?quartz_data.xml私のファイルからの抜粋:

<processing-directives>
    <overwrite-existing-data>false</overwrite-existing-data>
    <ignore-duplicates>true</ignore-duplicates>
</processing-directives>

<schedule>

    <trigger>
        <simple>
            <!-- ... -->
            <start-time>2012-05-10T07:00:00Z</start-time>
            <repeat-count>0</repeat-count>
            <repeat-interval>0</repeat-interval>
        </simple>
    </trigger>

最後の実行に達したためにデータベースから削除されたすべてのトリガーに問題があることに注意してください。

4

1 に答える 1

0

私はノーオペレーションになるように拡張StdJDBCDelegateしてオーバーライドすることになりました:deleteTrigger()

package com.example;

class DurableTriggersDriverDelegate extends StdJDBCDelegate {

    public DurableTriggersDriverDelegate(Logger logger, String tablePrefix, String schedName, String instanceId, ClassLoadHelper classLoadHelper) {
        super(logger, tablePrefix, schedName, instanceId, classLoadHelper);
    }

    public DurableTriggersDriverDelegate(Logger logger, String tablePrefix, String schedName, String instanceId, ClassLoadHelper classLoadHelper, Boolean useProperties) {
        super(logger, tablePrefix, schedName, instanceId, classLoadHelper, useProperties);
    }

    @Override
    public int deleteTrigger(Connection conn, TriggerKey triggerKey) throws SQLException {
        this.logger.debug("deleteTrigger(" + conn + ") skipped");
        return 1;
    }
}

新しい実装は、次の方法で簡単にプラグインできますquartz.properties

org.quartz.jobStore.driverDelegateClass=com.example.DurableTriggersDriverDelegate

このソリューションにはいくつかの欠点があります。

  • データベースは、起動されたトリガーを削除せずに、成長し続けます

  • 最初にすべてのトリガーを削除しようとするため (ただし、これは実行されません)、ジョブの詳細自体を削除しようとすると制約違反が発生するため、ジョブを削除することはできません。

しかし、それは私の元の問題を解決しました。

于 2012-05-27T12:58:25.483 に答える