我有一个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文件以添加作业,并在初始化调度程序时使用触发器调度它们,并且可以选择定期扫描文件以进行更改。
答案 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 。