0

这是我的要求。

主要作业:Job1(计划每 5 分钟运行一次) 附属作业:Job2、Job3、Job4、Job5 等,(所有附属作业将具有相同的定义,但只有 JobData 会有所不同)

在每次执行“Job1”期间,将安排一个辅助作业仅执行一次。示例:Job1 的第一次执行:Job“Job2”将在 DateTime.Now 2 分钟后安排。Job2 的第二次执行:Job“Job3”将在 DateTime.Now 2 分钟后安排...

现在,我希望所有作业都使用相同的 Scheduled。我的问题是 Quartz 是否对所有作业使用相同的调度程序,还是我们应该以编程方式设置它?

我正在使用 Windows 服务来启动和停止整个过程。这是 Windows 服务的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Configuration;

namespace TestScheduling
{
    class TestMainClass : ServiceBase
    {
        TestJobScheduler scheduler = new TestJobScheduler();

        public TestMainClass()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
            scheduler.StartScheduler();
                scheduler.ScheduleMainJob();
            }
            catch (Exception e)
            {
                //Capture Exception
            }
        }

        protected override void OnStop()
    {
        scheduler.StopScheduler();
    }
    }
}

这是类 TestJobScheduler 的代码。

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Data.Odbc;
using Quartz;
using Quartz.Impl;

namespace TestScheduling
{
    class TestJobScheduler : ITaskScheduler
    {
        IScheduler sched;

        public void ScheduleMainJob()
        {
            ....
            sched = getScheduler();
            sched.ScheduleJob(job1,trig);
            ....
            ScheduleSubsidiaryJob("job2")
        }

        public void ScheduleSubsidiaryJob(String jobname)
        {
            ...
            /*Create New Trigger and Associate Subsidiary Job with new JobData*/
            sched = getScheduler();
            sched.ScheduleJob(trig);
        }

        public IScheduler getScheduler()
        {
            ISchedulerFactory sf = new StdSchedulerFactory();
            return sf.GetScheduler();
        }

        public void StartScheduler(IJobDetail job, ISimpleTrigger trigger)
        {
            sched = getScheduler();
            sched.Start();
        }

        public void StopScheduler()
        {
            if (sched != null)
            {
                sched.Shutdown();
            }
        }
    }
}

还有一点是我将 AdoJobStore 与 OracleDelegate 一起使用。

有人可以告诉我我是否以正确的方式做事?

4

1 回答 1

0

您可以查看 Quartz.NET zip 发行版附带的 Quartz.Server 示例。也可以直接在 GitHub 上获得:

https://github.com/quartznet/quartznet/tree/master/server/Quartz.Server

您应该共享相同的调度程序。只创建一次调度程序工厂并从那里获取单例调度程序。

您可以只将您的作业添加到调度程序中一次,并使用触发器作业数据映射对其进行参数化。然后,您可以从作业执行上下文附带的 MergedJobDataMap 访问组合的作业和触发器数据。

每个触发都会实例化一个新的作业实例,因此作业详细信息在此处充当模板。

请注意 DateTime.Now 可能不是您想要的。对于 Quartz.NET,“现在”是 DateTime.UtcNow(或者更好的 DateTimeOffset.UtcNow)。

于 2013-12-03T05:51:14.810 回答