正如我从Quartz official documentation所理解的,AdoStore必须用于存储JobDataMap和其他数据等活动数据。如果我错了,请纠正我。
除了这个澄清之外,我想知道有没有办法从数据库加载作业和触发器定义。插件类型或类似Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin
的内容用于从xml文件中读取。
如果没有,是否是实现自定义插件的最佳解决方案,该插件将从数据库读取或使用其他方法?
[编辑] Rastko 8/13/2012 11:16:28 AM
从下面的答案我认为我没有把问题描述给你。 我想从数据库加载作业和触发器配置。就像它在代码或xml中定义的那样:
<job>
<name>WriterJob</name>
<group>CommonGroup</group>
<description>Test WriteJob</description>
<job-type>Console.WriteJob, Console</job-type>
</job>
<trigger>
<simple>
<name>WriterJobTrigger</name>
<group>CommonTriggerGroup</group>
<description>Simple trigger to simply fire sample job</description>
<job-name>WriterJob</job-name>
<job-group>CommonGroup</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<repeat-count>-1</repeat-count>
<repeat-interval>10000</repeat-interval>
</simple>
</trigger>
我想在DataBase中以相同的方式使用它。从ADOJobStore的生成表中我看到这些表与跟踪当前活动作业更相关 - 跟踪其状态,触发器触发等。
我希望我现在更清楚了。如果您需要任何其他说明,请随时问我。
答案 0 :(得分:11)
我想知道有没有办法从数据库加载作业和触发器定义。
如果您要从数据库中检索作业列表,可以执行以下操作:
Quartz.IScheduler scheduler ;
....
var details = (from groupName in scheduler.GetJobGroupNames()
from jobKey in scheduler.GetJobKeys(
Quartz.Impl.Matchers.GroupMatcher<Quartz.JobKey>
.GroupEquals(groupName))
select new
{
GroupName = groupName,
JobName = jobKey.Name ,
triggers = scheduler.GetTriggersOfJob(jobKey)
}
);
此语法适用于Quartz 2.0。
如果要从实际执行作业的程序构建单独的程序,那么您只需创建一个具有相同详细信息但不调用scheduler的调度程序.Start()
如果您要在数据库中添加新作业,可以执行以下操作:
(其中SimpleJob是作业的C#类名称)
string jobName = ...
string triggerName = ...
string cronExpression = ...
Quartz.IScheduler scheduler = ...
Quartz.IJobDetail jobDetail = Quartz.JobBuilder.Create<SimpleJob>()
.WithIdentity(jobName)
.StoreDurably()
.Build();
Quartz.ITrigger trigger = Quartz.TriggerBuilder.Create()
.WithIdentity(triggerName)
.WithSchedule(Quartz.CronScheduleBuilder.CronSchedule(cronExpression)
.ForJob(jobName)
.Build();
scheduler.ScheduleJob(jobDetail, trigger);
如果您要在不附加触发器的情况下将作业添加到数据库
Quartz.IJobDetail jobDetail = Quartz.JobBuilder.Create<SimpleJob>()
.WithIdentity(jobName)
.StoreDurably()
.Build();
scheduler.AddJob(jobDetail, false)
如果您希望安排执行一次性现有工作,那么
Quartz.ITrigger trigger1 = Quartz.TriggerBuilder.Create()
.WithIdentity(triggerName)
.WithSchedule(Quartz.SimpleScheduleBuilder.Create())
.ForJob(jobName)
.Build();
scheduler.ScheduleJob(trigger1);
答案 1 :(得分:0)
我正在使用Quartz for java,但由于基本逻辑是相同的,我可以说使用XML作为任务调度程序并不是一个好主意。在作业的每次状态更改时,您都需要更改xml文件。使用数据库(在您的情况下为AdoJobStore)可能更有效。
答案 2 :(得分:0)
查看XMLSchedulingDataProcessorPlugin implementation。 基本上你需要实现ISchedulerPlugin并添加逻辑来加载作业。