在 quartz.net 中安排并发作业
Scheduling concurrent jobs in quartz.net
我需要一些帮助。我正在尝试弄清楚如何使用 quartz.net 安排相关作业,并尽量避免在使用数据库连接时发生冲突。
我有一个包含 3 类 的 Web 应用程序:DownloadJob、UploadJob、Table1-Table2Job。
DownloadJob 每天凌晨 4 点将项目从 mysql 数据库下载到 Sql 数据库。
UploadJob 每 4 分钟从 sql table(Table2) 执行对 mysql 数据库的更新查询.
Table1-Table2Job 负责将项目从 sql table 转移到另一个 sql table 每 20 分钟
最大的问题是如何处理连接冲突。
如果 Table1-Table2Job 正在进行,UploadJob 必须等待。然后继续。
如果 UploadJob 正在进行,Table1-Table2Job 必须等待。
下载必须一直走。
我已经创建了一个调度程序 Class 希望代码是:
public class JobScheduler
{
public static void Start()
{
Ul1_Ul2dbJob classU1_U2Job = new Ul1_Ul2dbJob();
UploadJob classUpJob = new UploadJob();
IScheduler schedulerDownload = StdSchedulerFactory.GetDefaultScheduler();
IScheduler schedulerUl1_Ul2 = StdSchedulerFactory.GetDefaultScheduler();
//schedulerUl1_Ul2.Start();
IScheduler schedulerUpload = StdSchedulerFactory.GetDefaultScheduler();
//schedulerUpload.Start();
IJobDetail jobDown = JobBuilder.Create<DownloadJob>().Build();
IJobDetail jobUpl = JobBuilder.Create<UploadJob>().Build();
IJobDetail jobUl1_Ul2 = JobBuilder.Create<Ul1_Ul2dbJob>().Build();
//Trigger di Download
ITrigger trigger = TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule
(s =>
s.WithIntervalInHours(24)
.OnEveryDay()
.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(03, 00))
)
.Build();
// ITrigger trigger = TriggerBuilder.Create()
//.WithCronSchedule(string.Format(cronFormat))
//.Build();
//trigger dei Upload
ITrigger trigger1 = TriggerBuilder.Create()
.WithCronSchedule("0 0/1 * * * ?")
.StartNow()
.WithPriority(1)
.Build();
//trigger per spostamento UL1 a UL2
ITrigger trigger2 = TriggerBuilder.Create()
.WithCronSchedule("0 0/1 * * * ?")
.StartNow()
.WithPriority(1)
.Build();
schedulerUpload.Start();
schedulerUl1_Ul2.Start();
schedulerUpload.ScheduleJob(jobUpl, trigger1);
schedulerUl1_Ul2.ScheduleJob(jobUl1_Ul2, trigger2);
//schedulerUpload.ScheduleJob(jobUl1_Ul2, trigger2);
//// scheduling with use of function Lock()
lock (schedulerDownload)
{
schedulerDownload.Start();
schedulerDownload.ScheduleJob(jobDown, trigger);
}
}**
有人可以帮助我吗?
您可以通过调用 GetCurrentlyExecutingJobs()
查看哪些作业是 运行。但是,此方法不是集群感知的,因此它无法看到其他调度程序调度的作业。最好使用同一个调度程序来安排所有作业。
假设你这样做,你可以从 UploadJob
和 Table1-Table2Job
中执行以下操作
public void Execute(IJobExecutionContext context)
{
var jobKey = new JobKey("otherJob", "group1");
while (IsOtherJobRunning(context.Scheduler, jobKey)) // if job is running
{
Thread.Sleep(60000); // sleep for one minute
}
// continue with task.
}
/// <summary>
/// Checks whether a job with the supplied job key is current running
/// </summary>
/// <returns>true/false</returns>
public bool IsOtherJobRunning(IScheduler scheduler, JobKey key)
{
var jobs = scheduler.GetCurrentlyExecutingJobs();
foreach (var job in jobs)
{
if (job.JobDetail.Key.Name == key.Name)
{
return true;
}
}
return false;
}
您可以定义一个不允许并发执行的作业(使用 DisallowConcurrentExecution 属性)。您将在数据映射中有一个参数来告诉您它是用于上传还是在表之间传输。然后你每 4 分钟安排一个带上传参数的作业,每 20 分钟安排一个带传输参数的作业。Quartz 将确保不会同时执行它们,所以你不必自己做。
我需要一些帮助。我正在尝试弄清楚如何使用 quartz.net 安排相关作业,并尽量避免在使用数据库连接时发生冲突。 我有一个包含 3 类 的 Web 应用程序:DownloadJob、UploadJob、Table1-Table2Job。 DownloadJob 每天凌晨 4 点将项目从 mysql 数据库下载到 Sql 数据库。 UploadJob 每 4 分钟从 sql table(Table2) 执行对 mysql 数据库的更新查询. Table1-Table2Job 负责将项目从 sql table 转移到另一个 sql table 每 20 分钟
最大的问题是如何处理连接冲突。 如果 Table1-Table2Job 正在进行,UploadJob 必须等待。然后继续。 如果 UploadJob 正在进行,Table1-Table2Job 必须等待。 下载必须一直走。
我已经创建了一个调度程序 Class 希望代码是:
public class JobScheduler
{
public static void Start()
{
Ul1_Ul2dbJob classU1_U2Job = new Ul1_Ul2dbJob();
UploadJob classUpJob = new UploadJob();
IScheduler schedulerDownload = StdSchedulerFactory.GetDefaultScheduler();
IScheduler schedulerUl1_Ul2 = StdSchedulerFactory.GetDefaultScheduler();
//schedulerUl1_Ul2.Start();
IScheduler schedulerUpload = StdSchedulerFactory.GetDefaultScheduler();
//schedulerUpload.Start();
IJobDetail jobDown = JobBuilder.Create<DownloadJob>().Build();
IJobDetail jobUpl = JobBuilder.Create<UploadJob>().Build();
IJobDetail jobUl1_Ul2 = JobBuilder.Create<Ul1_Ul2dbJob>().Build();
//Trigger di Download
ITrigger trigger = TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule
(s =>
s.WithIntervalInHours(24)
.OnEveryDay()
.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(03, 00))
)
.Build();
// ITrigger trigger = TriggerBuilder.Create()
//.WithCronSchedule(string.Format(cronFormat))
//.Build();
//trigger dei Upload
ITrigger trigger1 = TriggerBuilder.Create()
.WithCronSchedule("0 0/1 * * * ?")
.StartNow()
.WithPriority(1)
.Build();
//trigger per spostamento UL1 a UL2
ITrigger trigger2 = TriggerBuilder.Create()
.WithCronSchedule("0 0/1 * * * ?")
.StartNow()
.WithPriority(1)
.Build();
schedulerUpload.Start();
schedulerUl1_Ul2.Start();
schedulerUpload.ScheduleJob(jobUpl, trigger1);
schedulerUl1_Ul2.ScheduleJob(jobUl1_Ul2, trigger2);
//schedulerUpload.ScheduleJob(jobUl1_Ul2, trigger2);
//// scheduling with use of function Lock()
lock (schedulerDownload)
{
schedulerDownload.Start();
schedulerDownload.ScheduleJob(jobDown, trigger);
}
}**
有人可以帮助我吗?
您可以通过调用 GetCurrentlyExecutingJobs()
查看哪些作业是 运行。但是,此方法不是集群感知的,因此它无法看到其他调度程序调度的作业。最好使用同一个调度程序来安排所有作业。
假设你这样做,你可以从 UploadJob
和 Table1-Table2Job
public void Execute(IJobExecutionContext context)
{
var jobKey = new JobKey("otherJob", "group1");
while (IsOtherJobRunning(context.Scheduler, jobKey)) // if job is running
{
Thread.Sleep(60000); // sleep for one minute
}
// continue with task.
}
/// <summary>
/// Checks whether a job with the supplied job key is current running
/// </summary>
/// <returns>true/false</returns>
public bool IsOtherJobRunning(IScheduler scheduler, JobKey key)
{
var jobs = scheduler.GetCurrentlyExecutingJobs();
foreach (var job in jobs)
{
if (job.JobDetail.Key.Name == key.Name)
{
return true;
}
}
return false;
}
您可以定义一个不允许并发执行的作业(使用 DisallowConcurrentExecution 属性)。您将在数据映射中有一个参数来告诉您它是用于上传还是在表之间传输。然后你每 4 分钟安排一个带上传参数的作业,每 20 分钟安排一个带传输参数的作业。Quartz 将确保不会同时执行它们,所以你不必自己做。