在持久保存“quartz_jobs.xml”文件的代码中创建作业

时间:2014-02-11 20:08:17

标签: quartz.net

我有一个quartz_jobs.xml文件,其中定义了作业。 我可以加载quartz_jobs.xml文件配置并开始触发作业。 Aka,从quartz_jobs.xml文件“读取”作业可以正常工作。

但是,如果我手动将作业添加到IScheduler,则此手动添加的作业将开始运行......(以及quartz_jobs.xml文件中定义的作业).... 但是这个工作没有被写入xml。

有没有办法将作业添加到IScheduler并将其写回到quartz_jobs.xml文件?

注意,当我将完全相同的代码连接到AdoStore,并且我调用IScheduler.Start()时,作业会被添加到数据库表中(也就是说,它们仍然存在)。 但连接到针对Xml运行的RamStore的相同代码不会将作业“保存”到quartz_jobs.xml文件中。

感谢。

这是我的quartz.config(不是作业)文件。

<quartz>

    <add key="quartz.plugin.jobInitializer.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin" />
    <add key="quartz.scheduler.instanceName" value="DefaultQuartzScheduler" />
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="2" />
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
    <add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml" />
    <add key="quartz.plugin.jobInitializer.failOnFileNotFound" value="true" />
    <add key="quartz.plugin.jobInitializer.scanInterval" value="120" />


</quartz>

http://quartznet.sourceforge.net/apidoc/2.0/html/html/2909678f-44c6-6e13-afa5-c50e7b5ee435.htm

XMLSchedulingDataProcessorPlugin类Quartz.NET API文档 此插件加载XML文件以添加作业,并在初始化调度程序时使用触发器调度它们,并且可以选择定期扫描文件以进行更改。

1 个答案:

答案 0 :(得分:1)

我认为你不能。

XMLSchedulingDataProcessor没有任何方法可以将作业序列化回文件,QuartzXmlConfiguration20似乎只有只读集合。

我试过做一些实验。

显然,您可以管理加载和处理xml文件的整个过程:

ITypeLoadHelper loadHelper = new SimpleTypeLoadHelper();
loadHelper.Initialize();
XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(loadHelper);
processor.OverWriteExistingData = true;
processor.ProcessFileAndScheduleJobs("my_jobs.xml", Scheduler);

(因此您不必在配置文件中使用任何配置) 但是,再一次,没有办法追加额外的元素。

另一种方法可能是反序列化xml文件并尝试操作它:

string xml = string.Empty;

using (var xmlJobFile = new System.IO.StreamReader("my_jobs.xml"))
{
    xml = xmlJobFile.ReadToEnd();
}

XmlSerializer xs = new XmlSerializer(typeof(QuartzXmlConfiguration20));
QuartzXmlConfiguration20 data = (QuartzXmlConfiguration20)xs.Deserialize(new StringReader(xml));

if (data == null)
{
    throw new SchedulerConfigException("Job definition data from XML was null after deserialization");
}

但它太复杂了。

我认为最好的选择是使用 AdoJobStore