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));
        }