【发布时间】:2014-03-03 08:55:26
【问题描述】:
我需要检索 Quartz.NET 数据库中所有触发器的列表,以便在表中列出有关它们的信息。我想要所有触发器,无论它们是正在运行、等待、获取还是其他。我只使用了一个调度程序名称和一个组,所以在我的情况下,这基本上是一个简单的问题,只需执行SELECT * FROM QRTZ_TRIGGERS(不完全正确,因为我还需要来自QRTZ_CRON_TRIGGERS 表的信息),但我会而是通过 API。
目前,我正在浏览所有已知的工作类型,并为每个工作类型致电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(),所以我假设它不存在是有原因的,尽管它看起来很简单。当有多个调度程序主机以集群模式或类似方式运行时,它是否与并发处理有关?这似乎是人们经常想做的事情。
【问题讨论】:
-
@labilbe 那里接受的答案使用我目前使用的相同技术,
GetTriggersOfJob。 -
这是使用对象模型的小缺点之一......与现有的 API......“设置操作”有时是事后的想法。你被“循环”困住了............你可以〜为开源项目做出贡献......在你编写代码做你想做的事情之后。
-
@granadaCoder 是的,如果我能找到时间来实现该功能,我可能会提出拉取请求。我主要想知道是否有 1) 我错过了什么;或 2) 它不存在的一些技术/哲学原因。
-
我自己也遇到过类似的问题:stackoverflow.com/questions/21537460/…
标签: c# quartz.net