Quartz.Net 使用 XmlPlugin,使用 Misfire 覆盖现有数据

Quartz.Net with XmlPlugin, use Misfire with overwrite-existing-data

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

我特别需要两个功能:

现在我被这个问题困住了:

我在网上找到了各种主题(比如这个:How to use cron misfire-instruction FireOnceNow with AdoJobStore in Quartz.NET 2.0?),其中解释了 <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> 在每个作业中使用 misfire 策​​略有什么作用。

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

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

相反,行为有所不同。

确实,如果我修改 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 并覆盖现有的。有关失火的信息将丢失。

所以,就像这里提到的 How to use cron misfire-instruction FireOnceNow with AdoJobStore in Quartz.NET 2.0? 解决方案是将 <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>