使用Quartz调度作业 - 需要意见

时间:2013-12-02 04:56:31

标签: c# windows-services quartz.net-2.0

这是我的要求。

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

在每次执行“Job1”期间,一个辅助作业将被安排仅执行一次。 例: 第一次执行Job1:作业“Job2”将从DateTime.Now安排2分钟 Job2的第二次执行:作业“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();
    }
    }
}

以下是Class 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。

有人能告诉我我是否正确地做事?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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