首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quartz XML插件在重新启动后重新调度触发的触发器

Quartz XML插件在重新启动后重新调度触发的触发器
EN

Stack Overflow用户
提问于 2012-05-10 21:38:46
回答 1查看 1.9K关注 0票数 1

我使用XML Scheduling Plugin (XMLSchedulingDataProcessorPlugin)在quartz-scheduler的JDBC job store中创建了几个启动时的作业和触发器。这可以很好地工作,但我对配置为只运行一次的简单触发器有一个问题。

当这样的触发器触发时,它将从数据库中删除,因为没有下一次触发时间。到目前一切尚好。不幸的是,当我重新启动应用程序时,插件找不到该触发器,因此它被重新插入。因为我使用的是MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY,所以这个作业会被一次又一次地从数据库中删除。重新启动应用程序会重复整个过程。

显然,我希望我的扳机只开一次枪。有没有可能将触发的触发器保留在数据库中,即使它们没有下一次触发时间?或者也许这可以用一种不同的方式解决?摘自我的quartz_data.xml文件:

代码语言:javascript
复制
<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>

请注意,所有触发器都存在问题,这些触发器到达了最后一次执行,因此已从数据库中删除。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-27 20:58:25

我最终扩展了StdJDBCDelegate并将deleteTrigger()覆盖为no-op:

代码语言:javascript
复制
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插入

代码语言:javascript
复制
org.quartz.jobStore.driverDelegateClass=com.example.DurableTriggersDriverDelegate

此解决方案有几个缺点:

  • 数据库不断增长,不删除已触发的triggers
  • deleting作业是不可能的,因为它首先尝试删除所有触发器(但未执行此操作),并且在尝试删除作业详细信息本身时会违反约束

然而,它解决了我最初的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10535203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档