Quartz.Net XmlPlugin 中,请将 Misfire 与覆盖现有数据一起使用



我是第一次使用 Quartz.Net(v 3.0.1),使用XML插件从XML文件调度作业和触发器。

我特别需要两个功能:

  • 使用失火策略,例如,FireOnceNow使用具有失火的 cron 触发器计划的特定作业
  • 在运行时加载其他作业并触发(修改 XML)

现在我遇到了这个问题:

我在网上找到了各种主题(比如这个:如何在 Quartz.NET 2.0 中使用 cron misfire-instruction fireOnceNow 与 AdoJobStore?),其中解释说<overwrite-existing-data>需要处于 false 才能使用 misfire 指令。 实际上,通过此设置,如果发生失火,作业将重新触发。

问题是这样我就无法在 XML 文件中插入其他作业和触发器:

[12:43:25] [Error] Could not schedule jobs and triggers from file
~/quartz_jobs.xml: Unable to store Job: 'JobGroup1.TestJob1', 
because one already exists with this identification.

我不希望每次都从 XML 中删除所有作业并触发添加新作业。(我更喜欢在 XML 中跟踪我所有计划的作业和触发器)

我想了解它与每项工作的失火政策<overwrite-existing-data>有什么关系。

我将回答我自己的问题,因为经过一些研究,我找到了解决方案。

我的错误是认为<overwrite-existing-data>设置以这种方式工作:如果我从未接触过与单个作业或其触发器相关的 XML 部分,则调度程序不会永远不会重新调度该作业/触发器。

相反,行为是不同的。

事实上,如果我修改 XML 添加另一个作业(或其他任何内容),调度程序会注意到该文件已更改,并带来其所有内容(甚至现有的作业和触发器)并覆盖以前存储在数据库中的内容。 当调度程序关闭时,也会发生同样的事情。

因此,例如,如果我的XML是这样的:

...
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>
...
<job>
<name>TestJob1</name>
<group>JobGroup1</group>
<description>description for TestJob1</description>
<job-type>TestJob1.TestJob1, TestJob1</job-type>
<durable>true</durable>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>Trigger1</name>
<group>MyTriggerGroup</group>
<job-name>TestJob1</job-name>
<job-group>JobGroup1</job-group>
<misfire-instruction>FireOnceNow</misfire-instruction>
<cron-expression>0/5 * * ? * * *</cron-expression>
</cron>
</trigger>

并且我关闭调度程序足够长的时间以产生失火,当我重新启动调度程序时,它将占用TestJob1Trigger1并覆盖现有的。有关失火的信息将丢失。

所以,就像这里提到的如何在 Quartz.NET 2.0中使用cron misfire-instruction FireOnceNow与AdoJobStore? 解决方案是将<overwrite-existing-data>设置为false

这样,每次XML发生更改时,我们都应该删除所有现有的作业和触发器,以免出现错误

[12:43:25] [Error] Could not schedule jobs and triggers from file
~/quartz_jobs.xml: Unable to store Job: 'JobGroup1.TestJob1', 
because one already exists with this identification.

为避免此问题,我们只需添加

<ignore-duplicates>true</ignore-duplicates>

最新更新