【问题标题】:Trigger specific Quartz jobs触发特定的 Quartz 作业
【发布时间】: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


【解决方案1】:

终于找到了解决办法。 Quartz 表中有一个名为Sched_Name 的列。 Quartz 调度程序使用此列来获取作业详细信息。 使用此列,我们可以在同一个 Quartz 表中拥有许多不同的组。无需创建单独的 Quartz 表集。 例如

SELECT * FROM QRTZ_JOB_DETAILS WHERE SCHED_NAME = 'CESA'

SELECT * FROM QRTZ_JOB_DETAILS WHERE SCHED_NAME = 'CESB'

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2011-11-15
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多