2012-05-10 15 views
1

XML Scheduling PluginXMLSchedulingDataProcessorPlugin)を使用して、JDBCジョブストアの起動時に複数のジョブとトリガーをに作成しています。これはうまく動作しますが、私は単純なトリガーが1回だけ実行するように設定されている問題があります。再起動後にクォーラムXMLプラグインの再スケジュールされたトリガー

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

明らかに、私のトリガは1回だけ発射したい。次の発射時間を持たなくても、発射トリガをデータベースに保持することは可能ですか?あるいは、これは別の方法で解決できますか?私quartz_data.xmlファイルからの抜粋:最後の実行に達したので、DBから削除されたすべてのトリガーに問題があること

<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> 

注意。

答えて

0

私は、OPはないように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 

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

  • データベースは、成長と成長し、焼成削除しない

  • 削除ジョブは、それは最初にすべてのトリガーを削除しようとするので、可能ではないトリガー(が、これは実行されません)と、ジョブの詳細自体

を削除しようとしたとき、制約違反が発生します

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