private void ProcessDescriptor(IDelayedJobDescriptor descriptor, IBackgroundJobClient jobClient) { PropertyReference <ScheduledJobInfo> jobInfoReference = descriptor.GetJobInfoReference(); if (descriptor.ShouldBeScheduled()) { DateTime intendedRunAt = descriptor.GetIntendedRunAt(); if (jobInfoReference.Value == null) { // Create the job ScheduleJob(descriptor, jobClient); } else if (jobInfoReference.Value.RunAt != intendedRunAt) { // Re-schedule the job CancelJob(jobInfoReference, jobClient); ScheduleJob(descriptor, jobClient); } return; } if (jobInfoReference.Value != null) { // The job isn't supposed to run but it's scheduled CancelJob(jobInfoReference, jobClient); } }
private void ScheduleJob(IDelayedJobDescriptor descriptor, IBackgroundJobClient jobClient) { string jobId = descriptor.Schedule(jobClient); ScheduledJobInfo jobInfo = new ScheduledJobInfo() { JobId = jobId, RunAt = descriptor.GetIntendedRunAt() }; descriptor.GetJobInfoReference().Value = jobInfo; _db.ScheduledJobInfos.Add(jobInfo); jobClient.ContinueJobWith <ScheduledJobCleaner>(jobId, cleaner => cleaner.Cleanup(jobInfo.Id)); }