1

我正在使用XML Scheduling Plugin ( ) 在XMLSchedulingDataProcessorPlugin的 JDBC 作业存储中启动时创建多个作业和触发器。这工作正常,但我有一个简单的触发器配置为只运行一次的问题。

当这样的触发器触发时,它会从数据库中删除,因为没有下一次触发时间。到现在为止还挺好。不幸的是,当我重新启动应用程序时,插件找不到该触发器,因此再次重新插入。因为我使用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>

请注意,所有到达最后一次执行的触发器都存在问题,因此已从 db.xml 中删除。

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