2014-02-11 31 views
1

我有一个quartz_jobs.xml文件,其中已经定义了作业。 我可以加载quartz_jobs.xml文件配置和作业开始射击。又名,从quartz_jobs.xml文件中“读取”工作正常工作。在保留“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

我不认为你可以。

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

+0

这就是我的想法。只需要一些确认。感谢您的努力。 – granadaCoder

+0

没问题。干杯。 – LeftyX