【问题标题】:Get all triggers in Quartz.NET获取 Quartz.NET 中的所有触发器
【发布时间】: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


【解决方案1】:

更直接的方法可能是

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

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

如果您只是报告,我会说咬紧牙关并使用(外部)连接等创建自定义 SQL 查询。只是不要在 Quartz 不知道的情况下更新 Quartz 的表。也不要发出数据库锁。如果架构更改,请准备修复查询。

【讨论】:

  • 感谢您的回复。你的解决方案似乎比我的好,而且在许多情况下它实际上应该更快,因为我的实际触发器可能比工作类型少。如果我确实使用手动 SQL 路由,我肯定会确保避免更新任何内容或创建锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多