【发布时间】:2020-11-23 10:57:46
【问题描述】:
我正在使用Quartz 来安排作业并使用控制台应用程序来执行所有作业。
我目前有 2 个控制台应用程序引用同一组 Quartz 表,即。 QRTZ_JOB_DETAILS、QRTZ_TRIGGERS 等
因此,当我执行没有作业的 ConsoleApp1(在 ConsoleApp2 中创建)时,我收到以下错误:
XYZ job: Couldn't retrieve job because a required type was not found: Could not load type 'XYZ-Job, XYZ.Job' ---> Quartz.JobPersistenceException:
我已经检查了解决方案here。
显而易见的解决方案是为每个控制台应用程序创建单独的 Quartz 表集。这样,我就不会收到任何负载类型错误。
我的问题是,在这种情况下,有没有办法只获得特定的工作(基于某些匹配),这样我就不需要创建 2 个表集。
在下面的代码中,我想如果我得到所有作业名称,我将禁用 ConsoleApp2 的触发器。但是,ConsoleApp2 将没有任何作业要运行! (这是因为,表是一样的)
如果有更好的解决方案,请告诉我。
protected async void StartScheduler1()
{
ISchedulerFactory schedFact = container.ResolveType<ISchedulerFactory>();
var schedTask = schedFact.GetScheduler();
schedTask.Wait();
scheduler = schedTask.Result;
var jobs = new List<JobKey>();
foreach (var group in scheduler.GetJobGroupNames().Result)
{
var groupMatcher = GroupMatcher<JobKey>.GroupContains(@group);
foreach (var jobKey in scheduler.GetJobKeys(groupMatcher).Result)
{
jobs.Add(jobKey);
}
}
scheduler.Start().Wait();
}
【问题讨论】:
-
您可以集群您的石英调度程序并编写与应用程序无关的作业,在这种情况下您不需要两组表。或者使用不同的quartz.conf文件以这种方式初始化每个调度程序,您可以存储在同一个表中,但调度器名称和组会不同,但您需要维护单独的配置
-
我确实有单独的配置文件,但这有什么帮助?能详细点吗?
-
更改调度程序名称并在两个配置文件中分配单独的名称,这样作业条目和相应的触发器将保存在该作业计划和组名下,石英将根据它们查询表。所以,可以使用同一张表,可以实现数据的分离。
标签: c# quartz.net