我正在使用XML Scheduling Plugin(XMLSchedulingDataProcessorPlugin
)在quartz-scheduler的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中删除。
答案 0 :(得分: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
此解决方案有几个缺点:
数据库不断增长和增长,而不是删除已触发的触发器
无法删除作业,因为它首先尝试删除所有触发器(但未执行此操作),并且在尝试删除作业详细信息时发生约束违规
然而它解决了我原来的问题。