Quartz.Net 使用 XmlPlugin,使用 Misfire 覆盖现有数据
Quartz.Net with XmlPlugin, use Misfire with overwrite-existing-data
我第一次使用 Quartz.Net (v 3.0.1),使用 XML 插件从 XML 文件安排作业和触发器。
我特别需要两个功能:
- 使用 misfire 策略,例如
FireOnceNow
为使用 cron 触发器安排的某个作业发生 misfire
- 在 运行 时间加载其他作业并触发(修改 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>
并且我关闭了调度程序足够长的时间以产生失火,当我重新启动调度程序时,它将占用 TestJob1
和 Trigger1
并覆盖现有的。有关失火的信息将丢失。
所以,就像这里提到的 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>
我第一次使用 Quartz.Net (v 3.0.1),使用 XML 插件从 XML 文件安排作业和触发器。
我特别需要两个功能:
- 使用 misfire 策略,例如
FireOnceNow
为使用 cron 触发器安排的某个作业发生 misfire - 在 运行 时间加载其他作业并触发(修改 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>
并且我关闭了调度程序足够长的时间以产生失火,当我重新启动调度程序时,它将占用 TestJob1
和 Trigger1
并覆盖现有的。有关失火的信息将丢失。
所以,就像这里提到的 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>