gpt4 book ai didi

c# - 获取 Quartz.NET 中的所有触发器

转载 作者:太空宇宙 更新时间:2023-11-03 21:35:20 25 4
gpt4 key购买 nike

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

目前我正在检查所有已知的作业类型并为每一个调用 GetTriggersOfJob,正如我在 Internet 上的几个地方看到的那样。我的真实代码比这更复杂,但这是它的要点:

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(),所以我假设这不存在是有原因的,即使它看起来像这样一个简单的。当有多个调度程序主机以集群模式或类似模式运行时,它是否与并发处理有关?这似乎是人们经常想做的事情。

最佳答案

更直接一点的方法可能是

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

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

如果您只是报告,我会说硬着头皮创建带有(外部)连接等的自定义 SQL 查询。只是不要在 Quartz 不知情的情况下更新 Quartz 的表。也不要发出数据库锁。准备在架构更改时修复查询。

关于c# - 获取 Quartz.NET 中的所有触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22142321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com