2012-05-10 57 views
1

我使用XML Scheduling PluginXMLSchedulingDataProcessorPlugin)在啓動時在JDBC作業存儲器中創建了幾個作業和觸發器,其中包括。這工作正常,但我有一個簡單的觸發器配置爲只運行一次的問題。Quartz XML插件在重新啓動後重新計劃觸發器觸發器

當這樣的觸發器觸發時,它將從數據庫中刪除,因爲沒有下一次觸發時間。到現在爲止還挺好。不幸的是,當我重新啓動應用程序時,插件找不到該觸發器,因此它會再次重新插入。因爲我使用MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY這個工作被再次從數據庫中刪除。重新啓動應用程序會重複整個過程。

顯然我想讓我的觸發器只觸發一次。即使他們沒有下一次火災時間,是否可以在數據庫中保留觸發器觸發器?或者,也許這可以用不同的方式解決?從我的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> 

注意,有一個與到達最後執行,因此從數據庫中刪除了所有的觸發問題。

回答

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 

這種解決方案有幾個缺點:

  • 數據庫保留在不斷擴張,而不是刪除觸發器上

  • 刪除的工作是不可能的,因爲它第一次嘗試刪除所有觸發器(但不執行),並試圖刪除的作業細節本身

當發生違反約束

但它解決了我原來的問題。

相關問題