private bool RequeueJobIfTimedOut(RedisConnection connection, string jobId, string queue) { var flags = connection.Redis.GetValuesFromHash( String.Format(RedisStorage.Prefix + "job:{0}", jobId), "Fetched", "Checked"); var fetched = flags[0]; var @checked = flags[1]; if (String.IsNullOrEmpty(fetched) && String.IsNullOrEmpty(@checked)) { // If the job does not have these flags set, then it is // in the implicit 'Fetched' state. This state has no // information about the time it was fetched. So we // can not do anything with the job in this state, because // there are two options: // 1. It is going to move to the implicit 'Fetched' state // in a short time. // 2. It will stay in the 'Fetched' state forever due to // its processing server is dead. // To ensure its server is dead, we'll move the job to // the implicit 'Checked' state with the current timestamp // and will not do anything else at this pass of the watcher. // If job's state will still be 'Checked' on the later passes // and after the CheckedTimeout expired, then the server // is dead, and we'll re-queue the job. connection.Redis.SetEntryInHash( String.Format(RedisStorage.Prefix + "job:{0}", jobId), "Checked", JobHelper.SerializeDateTime(DateTime.UtcNow)); // Checkpoint #1-2. The job is in the implicit 'Checked' state. // It will be re-queued after the CheckedTimeout will be expired. } else { if (TimedOutByFetchedTime(fetched) || TimedOutByCheckedTime(fetched, @checked)) { var fetchedJob = new RedisFetchedJob(connection.Redis, jobId, queue); fetchedJob.Dispose(); return(true); } } return(false); }
private bool RequeueJobIfTimedOut(RedisConnection connection, string jobId, string queue) { var flags = connection.Redis.GetValuesFromHash( String.Format(RedisStorage.Prefix + "job:{0}", jobId), "Fetched", "Checked"); var fetched = flags[0]; var @checked = flags[1]; if (String.IsNullOrEmpty(fetched) && String.IsNullOrEmpty(@checked)) { // If the job does not have these flags set, then it is // in the implicit 'Fetched' state. This state has no // information about the time it was fetched. So we // can not do anything with the job in this state, because // there are two options: // 1. It is going to move to the implicit 'Fetched' state // in a short time. // 2. It will stay in the 'Fetched' state forever due to // its processing server is dead. // To ensure its server is dead, we'll move the job to // the implicit 'Checked' state with the current timestamp // and will not do anything else at this pass of the watcher. // If job's state will still be 'Checked' on the later passes // and after the CheckedTimeout expired, then the server // is dead, and we'll re-queue the job. connection.Redis.SetEntryInHash( String.Format(RedisStorage.Prefix + "job:{0}", jobId), "Checked", JobHelper.SerializeDateTime(DateTime.UtcNow)); // Checkpoint #1-2. The job is in the implicit 'Checked' state. // It will be re-queued after the CheckedTimeout will be expired. } else { if (TimedOutByFetchedTime(fetched) || TimedOutByCheckedTime(fetched, @checked)) { var fetchedJob = new RedisFetchedJob(connection.Redis, jobId, queue); fetchedJob.Dispose(); return true; } } return false; }