这是我的要求。
主要工作: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。
有人能告诉我我是否正确地做事?
答案 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)。