private RecurringJobInfo InternalFind(string recurringJobId, Dictionary <string, string> recurringJob)
        {
            if (string.IsNullOrEmpty(recurringJobId))
            {
                throw new ArgumentNullException(nameof(recurringJobId));
            }
            if (recurringJob == null)
            {
                throw new ArgumentNullException(nameof(recurringJob));
            }

            // var serializedJob = SerializationHelper.Deserialize<InvocationData>(recurringJob["Job"]);
            var serializedJob = InvocationData.DeserializePayload(recurringJob["Job"]);
            var job           = serializedJob.DeserializeJob();

            return(new RecurringJobInfo
            {
                RecurringJobId = recurringJobId,
                Cron = recurringJob["Cron"],
                TimeZone = recurringJob.ContainsKey("TimeZoneId")
                                        ? TimeZoneInfo.FindSystemTimeZoneById(recurringJob["TimeZoneId"])
                                        : TimeZoneInfo.Utc,
                Queue = recurringJob["Queue"],
                Method = job.Method,
                Enable = recurringJob.ContainsKey(nameof(RecurringJobInfo.Enable))
                                        ? SerializationHelper.Deserialize <bool>(recurringJob[nameof(RecurringJobInfo.Enable)])
                                        : true,
                JobData = recurringJob.ContainsKey(nameof(RecurringJobInfo.JobData))
                                        ? SerializationHelper.Deserialize <Dictionary <string, object> >(recurringJob[nameof(RecurringJobInfo.JobData)])
                                        : null
            });
        }
Ejemplo n.º 2
0
        public void DeserializePayload_ThrowsAnException_WhenPayloadIsNull()
        {
            var exception = Assert.Throws <ArgumentNullException>(
                () => InvocationData.DeserializePayload(null));

            Assert.Equal("payload", exception.ParamName);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取job任务
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string GetJobdata(string name)
        {
            try
            {
                using (var connection = JobStorage.Current.GetConnection())
                {
                    Dictionary <string, string> dictionary = connection.GetAllEntriesFromHash("recurring-job:" + name);
                    if (dictionary == null || dictionary.Count == 0)
                    {
                        return("");
                    }

                    if (!dictionary.TryGetValue(nameof(Job), out var jobDetail))
                    {
                        return("");
                    }

                    var RecurringJob = InvocationData.DeserializePayload(jobDetail).DeserializeJob();

                    return(JsonConvert.SerializeObject(JsonConvert.DeserializeObject <RecurringJobItem>(RecurringJob.Args.FirstOrDefault()?.ToString())));
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorException("HttpJobDispatcher.GetJobdata", ex);
            }
            return("");
        }
Ejemplo n.º 4
0
        public override JobData GetJobData(string id)
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            if (!long.TryParse(id, out var parsedId))
            {
                return(null);
            }

            string sql =
                $@"select InvocationData, StateName, Arguments, CreatedAt from [{_storage.SchemaName}].Job with (readcommittedlock, forceseek) where Id = @id";

            return(_storage.UseConnection(_dedicatedConnection, connection =>
            {
                var jobData = connection.Query <SqlJob>(sql, new { id = parsedId }, commandTimeout: _storage.CommandTimeout)
                              .SingleOrDefault();

                if (jobData == null)
                {
                    return null;
                }

                // TODO: conversion exception could be thrown.
                var invocationData = InvocationData.DeserializePayload(jobData.InvocationData);

                if (!String.IsNullOrEmpty(jobData.Arguments))
                {
                    invocationData.Arguments = jobData.Arguments;
                }

                Job job = null;
                JobLoadException loadException = null;

                try
                {
                    job = invocationData.DeserializeJob();
                }
                catch (JobLoadException ex)
                {
                    loadException = ex;
                }

                return new JobData
                {
                    Job = job,
                    State = jobData.StateName,
                    CreatedAt = jobData.CreatedAt,
                    LoadException = loadException
                };
            }));
        }
Ejemplo n.º 5
0
        public void Deserialize_DeserializesCorrectlyShortFormatStringToInvocationData()
        {
            var invocationData = "{\"t\":\"Hangfire.Core.Tests.Storage.InvocationDataFacts, Hangfire.Core.Tests\",\"m\":\"Empty\"}";

            var serializedData = InvocationData.DeserializePayload(invocationData);

            var job = serializedData.Deserialize();

            Assert.False(job.Type.GetTypeInfo().ContainsGenericParameters);
            Assert.Equal("Empty", job.Method.Name);
            Assert.Equal(0, job.Method.GetParameters().Length);
            Assert.Equal(0, job.Args.Count);
        }
Ejemplo n.º 6
0
        public RecurringJobViewModel GetRecurringJobById(string id)
        {
            using var connection = _jobStorage.GetConnection();
            var hash = connection.GetAllEntriesFromHash($"recurring-job:{id}");

            if (hash == null)
            {
                return(null);
            }
            var _parameters = new List <KeyValuePair <string, string> >
            {
                KeyValuePair.Create(nameof(RecurringJobViewModel.Cron), hash["Cron"])
            };
            var model = new RecurringJobViewModel
            {
                Id         = id,
                Cron       = hash["Cron"],
                Parameters = _parameters
            };

            try
            {
                if (hash.TryGetValue("Job", out var payload) && !String.IsNullOrWhiteSpace(payload))
                {
                    var invocationData = InvocationData.DeserializePayload(payload);
                    var Job            = invocationData.DeserializeJob();
                    model.TypeName   = invocationData.Type;
                    model.MethodName = invocationData.Method;
                    ParameterInfo[] parameters = Job.Method.GetParameters();
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        _parameters.Add(KeyValuePair.Create(parameters[i].Name, Job.Args[i]?.ToString()));
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Could not load the job:{0}", id);
            }
            if (hash.ContainsKey("Queue"))
            {
                model.Queue = hash["Queue"];
                _parameters.Add(KeyValuePair.Create(nameof(model.Queue), model.Queue));
            }
            if (hash.ContainsKey("TimeZoneId"))
            {
                model.TimeZoneId = hash["TimeZoneId"];
                _parameters.Add(KeyValuePair.Create(nameof(model.TimeZoneId), model.TimeZoneId));
            }
            return(model);
        }
Ejemplo n.º 7
0
        public void Serialize_CorrectlyHandles_ParameterTypes_InPossibleOldFormat()
        {
            var invocationData = new InvocationData(
                "Hangfire.Core.Tests.Storage.InvocationDataFacts, Hangfire.Core.Tests",
                "ComplicatedMethod",
                "{\"$type\":\"System.Type[], mscorlib\",\"$values\":[\"System.Collections.Generic.IList`1[[System.String, mscorlib]], mscorlib\",\"Hangfire.Core.Tests.Storage.InvocationDataFacts+SomeClass, Hangfire.Core.Tests\"]}",
                "[null, null]");

            var serialized = invocationData.SerializePayload();
            var job        = InvocationData.DeserializePayload(serialized).Deserialize();

            Assert.Equal(typeof(InvocationDataFacts), job.Type);
            Assert.Equal(typeof(InvocationDataFacts).GetMethod("ComplicatedMethod"), job.Method);
        }
Ejemplo n.º 8
0
        public void DeserializePayload_CanHandleFieldBasedSerialization_OfInvocationDataClass()
        {
#pragma warning disable 618
            JobHelper.SetSerializerSettings(new JsonSerializerSettings {
                ContractResolver = new FieldsOnlyContractResolver()
            });
#pragma warning restore 618
            var payload = "{\"<Type>k__BackingField\":\"System.Console, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\",\"<Method>k__BackingField\":\"WriteLine\",\"<ParameterTypes>k__BackingField\":\"[]\",\"<Arguments>k__BackingField\":\"[]\"}";

            var data = InvocationData.DeserializePayload(payload);

            Assert.StartsWith("System.Console", data.Type);
            Assert.Equal("WriteLine", data.Method);
            Assert.Equal("[]", data.ParameterTypes);
            Assert.Equal("[]", data.Arguments);
        }
Ejemplo n.º 9
0
        private static Job DeserializeJob(string invocationData, string arguments)
        {
            var data = InvocationData.DeserializePayload(invocationData);

            if (!string.IsNullOrEmpty(arguments))
            {
                data.Arguments = arguments;
            }

            try
            {
                return(data.DeserializeJob());
            }
            catch (JobLoadException)
            {
                return(null);
            }
        }
Ejemplo n.º 10
0
        public void DeserializeJob_CanPreviousFormat_WhenTypeNameHandlingOptionIsSetToAll()
        {
            var settings = new JsonSerializerSettings {
                TypeNameHandling = TypeNameHandling.All
            };

            JsonConvert.DefaultSettings = () => settings;
#pragma warning disable 618
            JobHelper.SetSerializerSettings(settings);
#pragma warning restore 618

            var job = InvocationData
                      .DeserializePayload("{\"$type\":\"Hangfire.Storage.InvocationData, Hangfire.Core\",\"Type\":\"System.Console, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\",\"Method\":\"WriteLine\",\"ParameterTypes\":\"{\\\"$type\\\":\\\"System.Type[], mscorlib\\\",\\\"$values\\\":[\\\"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\\\"]}\",\"Arguments\":\"{\\\"$type\\\":\\\"System.String[], mscorlib\\\",\\\"$values\\\":[\\\"\\\\\\\"Hello \\\\\\\"\\\"]}\"}")
                      .DeserializeJob();

            Assert.Equal("System.Console", job.Type.FullName);
            Assert.Equal("WriteLine", job.Method.Name);
            Assert.Equal("Hello ", job.Args[0]);
        }
Ejemplo n.º 11
0
        private static Job DeserializeJob(string invocationData, string arguments, out InvocationData data, out Exception exception)
        {
            data = InvocationData.DeserializePayload(invocationData);

            if (!String.IsNullOrEmpty(arguments))
            {
                data.Arguments = arguments;
            }

            try
            {
                exception = null;
                return(data.DeserializeJob());
            }
            catch (JobLoadException ex)
            {
                exception = ex;
                return(null);
            }
        }
Ejemplo n.º 12
0
        public void Deserialize_DeserializesCorrectlyStringToInvocationData(string invocationData)
        {
            try
            {
                JobHelper.SetSerializerSettings(new JsonSerializerSettings {
                    TypeNameHandling = TypeNameHandling.All
                });
                var serializedData = InvocationData.DeserializePayload(invocationData);

                var job = serializedData.Deserialize();

                Assert.False(job.Type.GetTypeInfo().ContainsGenericParameters);
                Assert.Equal("Sample", job.Method.Name);
                Assert.Equal(typeof(string), job.Method.GetParameters()[0].ParameterType);
                Assert.Equal(1, job.Args.Count);
                Assert.Equal("Hello", job.Args[0]);
            }
            finally
            {
                JobHelper.SetSerializerSettings(null);
            }
        }
        public static RecurringJobDto GetRecurringJobDto(this IStorageConnection connection, string recurringJobId)
        {
            var hash = connection.GetAllEntriesFromHash($"recurring-job:{recurringJobId}");

            if (hash == null)
            {
                return(null);
            }

            var dto = new RecurringJobDto
            {
                Id   = recurringJobId,
                Cron = hash["Cron"]
            };

            try
            {
                if (hash.TryGetValue("Job", out var payload) && !String.IsNullOrWhiteSpace(payload))
                {
                    var invocationData = InvocationData.DeserializePayload(payload);
                    dto.Job = invocationData.DeserializeJob();
                }
            }
            catch (JobLoadException ex)
            {
                dto.LoadException = ex;
            }

            if (hash.ContainsKey("NextExecution"))
            {
                dto.NextExecution = JobHelper.DeserializeNullableDateTime(hash["NextExecution"]);
            }

            if (hash.ContainsKey("LastJobId") && !string.IsNullOrWhiteSpace(hash["LastJobId"]))
            {
                dto.LastJobId = hash["LastJobId"];

                var stateData = connection.GetStateData(dto.LastJobId);
                if (stateData != null)
                {
                    dto.LastJobState = stateData.Name;
                }
            }

            if (hash.ContainsKey("Queue"))
            {
                dto.Queue = hash["Queue"];
            }

            if (hash.ContainsKey("LastExecution"))
            {
                dto.LastExecution = JobHelper.DeserializeNullableDateTime(hash["LastExecution"]);
            }

            if (hash.ContainsKey("TimeZoneId"))
            {
                dto.TimeZoneId = hash["TimeZoneId"];
            }

            if (hash.ContainsKey("CreatedAt"))
            {
                dto.CreatedAt = JobHelper.DeserializeNullableDateTime(hash["CreatedAt"]);
            }

            if (hash.TryGetValue("Error", out var error))
            {
                dto.Error = error;
            }

            return(dto);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 获取jobAgent类型的JobInfo
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task <JobDetailInfo> GetBackGroundJobDetail(DashboardContext context)
        {
            var jobItem = await GetRequestBody <HttpJobItem>(context);

            var result  = new JobDetailInfo();
            var jobName = string.Empty;

            try
            {
                using (var connection = JobStorage.Current.GetConnection())
                {
                    Job job = null;

                    if (string.IsNullOrEmpty(jobItem.Cron))
                    {
                        var jobData = connection.GetJobData(jobItem.JobName);
                        if (jobData == null)
                        {
                            result.Info = "GetJobDetail Error:can not found job by id:" + jobItem.JobName;
                            return(result);
                        }

                        job = jobData.Job;
                    }
                    else
                    {
                        Dictionary <string, string> dictionary = connection.GetAllEntriesFromHash("recurring-job:" + jobItem.JobName);
                        if (dictionary == null || dictionary.Count == 0)
                        {
                            result.Info = "GetJobDetail Error:can not found job by id:" + jobItem.JobName;
                            return(result);
                        }

                        if (!dictionary.TryGetValue(nameof(Job), out var jobDetail))
                        {
                            result.Info = "GetJobDetail Error:can not found job by id:" + jobItem.JobName;
                            return(result);
                        }

                        job = InvocationData.DeserializePayload(jobDetail).DeserializeJob();
                    }
                    var jobItem2    = job.Args.FirstOrDefault();
                    var httpJobItem = jobItem2 as HttpJobItem;
                    if (httpJobItem == null)
                    {
                        result.Info = $"GetJobDetail Error:jobData can not found job by id:" + jobItem.JobName;
                        return(result);
                    }

                    result.JobName = jobName = httpJobItem.JobName;
                    if (string.IsNullOrEmpty(httpJobItem.AgentClass))
                    {
                        result.Info = $"{(!string.IsNullOrEmpty(jobName) ? "【" + jobName + "】" : string.Empty)} Error:is not AgentJob! ";
                        return(result);
                    }

                    var jobInfo = HttpJob.GetAgentJobDetail(httpJobItem);
                    if (string.IsNullOrEmpty(jobInfo))
                    {
                        result.Info = $"{(!string.IsNullOrEmpty(jobName) ? "【" + jobName + "】" : string.Empty)} Error:get null info! ";
                        return(result);
                    }
                    jobInfo     = jobInfo.Replace("\r\n", "<br/>");
                    result.Info = jobInfo;
                    return(result);
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorException("HttpJobDispatcher.GetBackGroundJobDetail", ex);
                result.Info = $"{(!string.IsNullOrEmpty(jobName) ? "【" + jobName + "】" : string.Empty)} GetJobDetail Error:" + ex.ToString();
                return(result);
            }
        }
        public static List <PeriodicJob> GetAllJobStopped()
        {
            var outPut = new List <PeriodicJob>();

            using (var connection = JobStorage.Current.GetConnection())
            {
                var allJobStopped = connection.GetAllItemsFromSet(tagStopJob);

                allJobStopped.ToList().ForEach(jobId =>
                {
                    var dto = new PeriodicJob();

                    var dataJob    = connection.GetAllEntriesFromHash($"{tagRecurringJob}:{jobId}");
                    dto.Id         = jobId;
                    dto.TimeZoneId = "UTC"; // Default

                    try
                    {
                        if (dataJob.TryGetValue("Job", out var payload) && !String.IsNullOrWhiteSpace(payload))
                        {
                            var invocationData = InvocationData.DeserializePayload(payload);
                            var job            = invocationData.DeserializeJob();
                            dto.Method         = job.Method.Name;
                            dto.Class          = job.Type.Name;
                        }
                    }
                    catch (JobLoadException ex)
                    {
                        dto.Error = ex.Message;
                    }

                    if (dataJob.ContainsKey("TimeZoneId"))
                    {
                        dto.TimeZoneId = dataJob["TimeZoneId"];
                    }

                    if (dataJob.ContainsKey("NextExecution"))
                    {
                        var tempNextExecution = JobHelper.DeserializeNullableDateTime(dataJob["NextExecution"]);

                        dto.NextExecution = tempNextExecution.HasValue ? tempNextExecution.Value.ChangeTimeZone(dto.TimeZoneId).ToString("G") : "N/A";
                    }

                    if (dataJob.ContainsKey("LastJobId") && !string.IsNullOrWhiteSpace(dataJob["LastJobId"]))
                    {
                        dto.LastJobId = dataJob["LastJobId"];

                        var stateData = connection.GetStateData(dto.LastJobId);
                        if (stateData != null)
                        {
                            dto.LastJobState = stateData.Name;
                        }
                    }

                    if (dataJob.ContainsKey("Queue"))
                    {
                        dto.Queue = dataJob["Queue"];
                    }

                    if (dataJob.ContainsKey("LastExecution"))
                    {
                        var tempLastExecution = JobHelper.DeserializeNullableDateTime(dataJob["LastExecution"]);

                        dto.LastExecution = tempLastExecution.HasValue ? tempLastExecution.Value.ChangeTimeZone(dto.TimeZoneId).ToString("G") : "N/A";
                    }

                    if (dataJob.ContainsKey("CreatedAt"))
                    {
                        dto.CreatedAt = JobHelper.DeserializeNullableDateTime(dataJob["CreatedAt"]);
                        dto.CreatedAt = dto.CreatedAt.HasValue ? dto.CreatedAt.Value.ChangeTimeZone(dto.TimeZoneId) : new DateTime();
                    }

                    if (dataJob.TryGetValue("Error", out var error) && !String.IsNullOrEmpty(error))
                    {
                        dto.Error = error;
                    }

                    dto.Removed  = false;
                    dto.JobState = "Stopped";

                    outPut.Add(dto);
                });
            }
            return(outPut);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 停止或者暂停项目
        /// </summary>
        /// <param name="jobname"></param>
        /// <returns></returns>
        public string PauseOrRestartJob(string jobname)
        {
            try
            {
                using (var connection = JobStorage.Current.GetConnection())
                {
                    Dictionary <string, string> dictionary = connection.GetAllEntriesFromHash("recurring-job:" + jobname);
                    if (dictionary == null || dictionary.Count == 0)
                    {
                        return("not found recurring-job:" + jobname);
                    }

                    if (!dictionary.TryGetValue(nameof(Job), out var jobDetail))
                    {
                        return("not found recurring-job:" + jobname);
                    }

                    var RecurringJob = InvocationData.DeserializePayload(jobDetail).DeserializeJob();

                    var job = CodingUtil.FromJson <HttpJobItem>(RecurringJob.Args.FirstOrDefault()?.ToString());

                    if (job == null)
                    {
                        return("fail parse recurring-job:" + jobname);
                    }

                    using (var tran = connection.CreateWriteTransaction())
                    {
                        //拿到所有的设置
                        var conts = connection.GetAllItemsFromSet($"JobPauseOf:{jobname}");

                        //有就先清掉
                        foreach (var pair in conts)
                        {
                            tran.RemoveFromSet($"JobPauseOf:{jobname}", pair);
                        }

                        var cron = conts.FirstOrDefault(r => r.StartsWith("Cron:"));
                        if (!string.IsNullOrEmpty(cron))
                        {
                            cron = cron.Replace("Cron:", "");
                        }
                        //如果包含有true 的 说明已经设置了 暂停 要把改成 启动 并且拿到 Cron 进行更新
                        if (conts.Contains("true"))
                        {
                            tran.AddToSet($"JobPauseOf:{jobname}", "false");
                            if (!string.IsNullOrEmpty(cron))
                            {
                                job.Cron = cron;
                                AddHttprecurringjob(job);
                            }
                        }
                        else
                        {
                            tran.AddToSet($"JobPauseOf:{jobname}", "true");
                            tran.AddToSet($"JobPauseOf:{jobname}", "Cron:" + job.Cron);
                            job.Cron = "";
                            AddHttprecurringjob(job);
                        }

                        tran.Commit();
                    }
                }

                return(string.Empty);
            }
            catch (Exception ex)
            {
                Logger.ErrorException("HttpJobDispatcher.PauseOrRestartJob", ex);
                return(ex.Message);
            }
        }
Ejemplo n.º 17
0
        public RecurringJobEntity(
            [NotNull] string recurringJobId,
            [NotNull] IDictionary <string, string> recurringJob,
            [NotNull] ITimeZoneResolver timeZoneResolver,
            DateTime now)
        {
            if (timeZoneResolver == null)
            {
                throw new ArgumentNullException(nameof(timeZoneResolver));
            }

            _recurringJob = recurringJob ?? throw new ArgumentNullException(nameof(recurringJob));
            _now          = now;

            RecurringJobId = recurringJobId ?? throw new ArgumentNullException(nameof(recurringJobId));

            if (recurringJob.ContainsKey("Queue") && !String.IsNullOrWhiteSpace(recurringJob["Queue"]))
            {
                Queue = recurringJob["Queue"];
            }

            try
            {
                TimeZone = recurringJob.ContainsKey("TimeZoneId") && !String.IsNullOrWhiteSpace(recurringJob["TimeZoneId"])
                    ? timeZoneResolver.GetTimeZoneById(recurringJob["TimeZoneId"])
                    : TimeZoneInfo.Utc;
            }
            catch (Exception ex)
            {
                _errors.Add(ex);
            }

            if (recurringJob.ContainsKey("Cron") && !String.IsNullOrWhiteSpace(recurringJob["Cron"]))
            {
                Cron = recurringJob["Cron"];
            }

            try
            {
                if (!recurringJob.ContainsKey("Job") || String.IsNullOrWhiteSpace(recurringJob["Job"]))
                {
                    throw new InvalidOperationException("The 'Job' field has a null or empty value");
                }

                Job = InvocationData.DeserializePayload(recurringJob["Job"]).DeserializeJob();
            }
            catch (Exception ex)
            {
                _errors.Add(ex);
            }

            if (recurringJob.ContainsKey("LastJobId") && !String.IsNullOrWhiteSpace(recurringJob["LastJobId"]))
            {
                LastJobId = recurringJob["LastJobId"];
            }

            if (recurringJob.ContainsKey("LastExecution") && !String.IsNullOrWhiteSpace(recurringJob["LastExecution"]))
            {
                LastExecution = JobHelper.DeserializeDateTime(recurringJob["LastExecution"]);
            }

            if (recurringJob.ContainsKey("NextExecution") && !String.IsNullOrWhiteSpace(recurringJob["NextExecution"]))
            {
                NextExecution = JobHelper.DeserializeDateTime(recurringJob["NextExecution"]);
            }

            if (recurringJob.ContainsKey("CreatedAt") && !String.IsNullOrWhiteSpace(recurringJob["CreatedAt"]))
            {
                CreatedAt = JobHelper.DeserializeDateTime(recurringJob["CreatedAt"]);
            }
            else
            {
                CreatedAt = now;
            }

            if (recurringJob.ContainsKey("V") && !String.IsNullOrWhiteSpace(recurringJob["V"]))
            {
                Version = int.Parse(recurringJob["V"], CultureInfo.InvariantCulture);
            }

            if (recurringJob.TryGetValue("RetryAttempt", out var attemptString) &&
                int.TryParse(attemptString, out var retryAttempt))
            {
                RetryAttempt = retryAttempt;
            }
        }
Ejemplo n.º 18
0
        private static List <RecurringJobDto> GetRecurringJobDtos(IStorageConnection connection, IEnumerable <string> ids)
        {
            var result = new List <RecurringJobDto>();

            foreach (var id in ids)
            {
                var hash = connection.GetAllEntriesFromHash($"recurring-job:{id}");

                if (hash == null)
                {
                    result.Add(new RecurringJobDto {
                        Id = id, Removed = true
                    });
                    continue;
                }

                var dto = new RecurringJobDto
                {
                    Id   = id,
                    Cron = hash["Cron"]
                };

                try
                {
                    if (hash.TryGetValue("Job", out var payload) && !String.IsNullOrWhiteSpace(payload))
                    {
                        var invocationData = InvocationData.DeserializePayload(payload);
                        dto.Job = invocationData.DeserializeJob();
                    }
                }
                catch (JobLoadException ex)
                {
                    dto.LoadException = ex;
                }

                if (hash.ContainsKey("NextExecution"))
                {
                    dto.NextExecution = JobHelper.DeserializeNullableDateTime(hash["NextExecution"]);
                }

                if (hash.ContainsKey("LastJobId") && !string.IsNullOrWhiteSpace(hash["LastJobId"]))
                {
                    dto.LastJobId = hash["LastJobId"];

                    var stateData = connection.GetStateData(dto.LastJobId);
                    if (stateData != null)
                    {
                        dto.LastJobState = stateData.Name;
                    }
                }

                if (hash.ContainsKey("Queue"))
                {
                    dto.Queue = hash["Queue"];
                }

                if (hash.ContainsKey("LastExecution"))
                {
                    dto.LastExecution = JobHelper.DeserializeNullableDateTime(hash["LastExecution"]);
                }

                if (hash.ContainsKey("TimeZoneId"))
                {
                    dto.TimeZoneId = hash["TimeZoneId"];
                }

                if (hash.ContainsKey("CreatedAt"))
                {
                    dto.CreatedAt = JobHelper.DeserializeNullableDateTime(hash["CreatedAt"]);
                }
                if (hash.ContainsKey("PauseState"))
                {
                    dto.PauseState = SerializationHelper.Deserialize <bool>(hash["PauseState"]);
                }
                if (hash.TryGetValue("Error", out var error))
                {
                    dto.Error = error;
                }

                result.Add(dto);
            }

            return(result);
        }
Ejemplo n.º 19
0
        public RecurringJobEntity(
            [NotNull] string recurringJobId,
            [NotNull] IDictionary <string, string> recurringJob,
            [NotNull] ITimeZoneResolver timeZoneResolver,
            DateTime now)
        {
            if (timeZoneResolver == null)
            {
                throw new ArgumentNullException(nameof(timeZoneResolver));
            }

            _recurringJob = recurringJob ?? throw new ArgumentNullException(nameof(recurringJob));

            RecurringJobId = recurringJobId ?? throw new ArgumentNullException(nameof(recurringJobId));

            if (recurringJob.ContainsKey("Queue") && !String.IsNullOrWhiteSpace(recurringJob["Queue"]))
            {
                Queue = recurringJob["Queue"];
            }

            TimeZone = recurringJob.ContainsKey("TimeZoneId") && !String.IsNullOrWhiteSpace(recurringJob["TimeZoneId"])
                ? timeZoneResolver.GetTimeZoneById(recurringJob["TimeZoneId"])
                : TimeZoneInfo.Utc;

            if (recurringJob.ContainsKey("Cron") && !String.IsNullOrWhiteSpace(recurringJob["Cron"]))
            {
                Cron = recurringJob["Cron"];
            }

            if (recurringJob.ContainsKey("Job") && !String.IsNullOrWhiteSpace(recurringJob["Job"]))
            {
                Job = InvocationData.DeserializePayload(recurringJob["Job"]).DeserializeJob();
            }

            if (recurringJob.ContainsKey("LastJobId") && !String.IsNullOrWhiteSpace(recurringJob["LastJobId"]))
            {
                LastJobId = recurringJob["LastJobId"];
            }

            if (recurringJob.ContainsKey("LastExecution") && !String.IsNullOrWhiteSpace(recurringJob["LastExecution"]))
            {
                LastExecution = JobHelper.DeserializeDateTime(recurringJob["LastExecution"]);
            }

            if (recurringJob.ContainsKey("NextExecution") && !String.IsNullOrWhiteSpace(recurringJob["NextExecution"]))
            {
                NextExecution = JobHelper.DeserializeDateTime(recurringJob["NextExecution"]);
            }

            if (recurringJob.ContainsKey("CreatedAt") && !String.IsNullOrWhiteSpace(recurringJob["CreatedAt"]))
            {
                CreatedAt = JobHelper.DeserializeDateTime(recurringJob["CreatedAt"]);
            }
            else
            {
                CreatedAt = now;
            }

            if (recurringJob.ContainsKey("V") && !String.IsNullOrWhiteSpace(recurringJob["V"]))
            {
                Version = int.Parse(recurringJob["V"], CultureInfo.InvariantCulture);
            }
        }