2014-03-03 60 views
0

我需要检索Quartz.NET数据库中所有触发器的列表,以便我可以在表中列出有关它们的信息。我希望所有的触发器,无论他们是否在运行,等待,获得或其他。我只使用一个调度程序名称和一个组,所以在我的情况下,这基本上是一个简单的事情做SELECT * FROM QRTZ_TRIGGERS(不完全正确,因为我也需要从QRTZ_CRON_TRIGGERS表中获得信息),但我宁愿通过API。获取Quartz.NET中的所有触发器

目前我正在浏览所有已知的工作类型,并为每个工作类型打电话GetTriggersOfJob,正如我在互联网上的几个地方推荐的那样。我真正的代码比这更复杂,但是这是它的要点:

var allJobKeys = *a list of all known jobs* 
var scheduler = *a new scheduler object* 
var allTriggers = allJobKeys 
    .Select(scheduler.GetTriggersOfJob) 
    .ToList(); 

这真的是这样做的唯一途径?这真的很无效!我有大约30种不同的工作类型(和计数),其中大多数在任何给定时间可能都没有与他们关联的触发器。但是这将需要每次30个数据库查询,而不是一个检索所有这些查询的单个查询。

请注意,我正在检索触发器的调度器仅用于此目的以及用于创建/更新/删除触发器,并且永远不会用于执行作业。我保证永远不要致电scheduler.Start()就可以了。

从我可以告诉的是,在Java的原始Quartz API中也没有getAllTriggers(),所以我假设这是不存在的原因,即使它看起来像这样一个不费吹灰之力。当有多个调度程序主机运行在集群模式或类似的情况下,它是否可以处理并发处理?这似乎是人们想要经常做的事情。

+0

是不是这个答案可在http://stackoverflow.com/questions/12489450/get-all-jobs-in-quartz-net-2-0 – labilbe

+0

@labilbe在那里接受的答案使用相同的技术,我'正在使用'GetTriggersOfJob'。 –

+0

这是使用对象模型的一个小缺点...使用现有的API .....“集合操作”有时是事后的想法。你被困在“循环”........你可以〜贡献开源项目......在你编写代码后做你想做的事情。 – granadaCoder

回答

3

一点更直接的方式可能是

var allTriggerKeys = sched.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup()); 
foreach (var triggerKey in allTriggerKeys) 
{ 
    ITrigger trigger = sched.GetTrigger(triggerKey); 
} 

为什么这么复杂和缓慢?这里的事情是有触发多态性,并且类型(以及因此通过链接表的关联数据)事先不知道。基本记录加载后,其余数据可以加载。是的,API本来不是用于集合操作的。

如果你只是报告,我会说咬子弹和创建自定义的SQL查询(外)连接等。只是不更新​​石英的表没有Quartz知道它。也不要发出数据库锁。准备修复模式更改后的查询。

+0

感谢您的答复。你的解决方案似乎比我的解决方案好,在许多情况下,它实际上应该更快,因为我可能比工作类型的实际触发器更少。如果我使用手动SQL路由,我肯定会确保我避免更新任何内容或创建锁定。 –