首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quartz作业存储是否与活动数据相关?

Quartz作业存储是否与活动数据相关?
EN

Stack Overflow用户
提问于 2012-08-10 23:20:43
回答 3查看 5.4K关注 0票数 4

根据我对Quartz official documentation的理解,AdoStore必须用于像JobDataMap和其他数据一样的活动数据存储。如果我错了,请纠正我。

除了这个澄清之外,我想知道是否有任何方法可以从数据库加载作业和触发器定义。一种插件或者类似Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin的东西是用来从xml文件中读取的。

如果没有,最好的解决方案是实现一个可以从数据库中读取的自定义插件,还是使用其他方法?

编辑Rastko 8/13/2012 11:16:28 AM

从下面的回答来看,我认为我没有很好地描述你的问题。我想从数据库加载作业和触发配置。在代码中或在xml中定义如下:

代码语言:javascript
复制
    <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生成的表中,我看到这些表更多地与跟踪当前活动的作业相关-跟踪其状态,触发器触发等。

我希望我现在更清楚了。如果您需要任何额外的澄清,请随时向我询问。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-12 04:14:04

我想知道有没有办法从数据库中加载作业和触发器定义。

如果您希望从数据库中检索作业列表,则可以执行以下操作:

代码语言:javascript
复制
  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#类名)

代码语言:javascript
复制
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);

如果要在不附加触发器的情况下将作业添加到数据库

代码语言:javascript
复制
Quartz.IJobDetail jobDetail = Quartz.JobBuilder.Create<SimpleJob>()
                    .WithIdentity(jobName)
                    .StoreDurably()
                    .Build();

scheduler.AddJob(jobDetail, false)

如果您希望调度执行一次性现有作业,则

代码语言:javascript
复制
   Quartz.ITrigger trigger1 = Quartz.TriggerBuilder.Create()
                        .WithIdentity(triggerName)
                        .WithSchedule(Quartz.SimpleScheduleBuilder.Create())
                        .ForJob(jobName)
                        .Build();

   scheduler.ScheduleJob(trigger1);
票数 13
EN

Stack Overflow用户

发布于 2012-08-10 23:46:27

我正在使用Quartz for java,但是由于基本逻辑是相同的,所以我可以说使用XML作为任务调度器不是一个好主意。每次更改作业的状态时,都需要更改xml文件。使用数据库(在您的例子中是AdoJobStore)可能更有效。

票数 0
EN

Stack Overflow用户

发布于 2015-01-29 21:36:20

看看XMLSchedulingDataProcessorPlugin implementation吧。基本上,您需要实现ISchedulerPlugin并添加您的逻辑来加载作业。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11904667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档