示例#1
0
        private void TryScheduleJob(IStorageConnection connection, string recurringJobId, Dictionary <string, string> recurringJob)
        {
            var serializedJob = JobHelper.FromJson <InvocationData>(recurringJob["Job"]);
            var job           = serializedJob.Deserialize();
            var cron          = recurringJob["Cron"];
            var parts         = cron.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            var cronSchedule  = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions {
                IncludingSeconds = (parts.Length >= 6)
            });

            try
            {
                var timeZone = recurringJob.ContainsKey("TimeZoneId")
                ? TimeZoneInfo.FindSystemTimeZoneById(recurringJob["TimeZoneId"])
                : TimeZoneInfo.Utc;

                var instant = _instantFactory.GetInstant(cronSchedule, timeZone);

                var lastExecutionTime = recurringJob.ContainsKey("LastExecution")
                    ? JobHelper.DeserializeDateTime(recurringJob["LastExecution"])
                    : (DateTime?)null;

                var changedFields = new Dictionary <string, string>();

                if (instant.GetNextInstants(lastExecutionTime).Any())
                {
                    var state = new EnqueuedState {
                        Reason = "Triggered by recurring job scheduler"
                    };
                    var jobId = _client.Create(job, state);

                    if (String.IsNullOrEmpty(jobId))
                    {
                        Logger.DebugFormat(
                            "Recurring job '{0}' execution at '{1}' has been canceled.",
                            recurringJobId,
                            instant.NowInstant);
                    }

                    changedFields.Add("LastExecution", JobHelper.SerializeDateTime(instant.NowInstant));
                    changedFields.Add("LastJobId", jobId ?? String.Empty);
                }

                changedFields.Add("NextExecution", JobHelper.SerializeDateTime(instant.NextInstant));

                connection.SetRangeInHash(
                    String.Format("recurring-job:{0}", recurringJobId),
                    changedFields);
            }
            catch (TimeZoneNotFoundException ex)
            {
                Logger.ErrorException(
                    String.Format("Recurring job '{0}' was not triggered: {1}.", recurringJobId, ex.Message),
                    ex);
            }
        }
示例#2
0
        private void TryScheduleJob(IStorageConnection connection, string recurringJobId, Dictionary <string, string> recurringJob)
        {
            var serializedJob = JobHelper.FromJson <InvocationData>(recurringJob["Job"]);
            var job           = serializedJob.Deserialize();
            var cron          = recurringJob["Cron"];
            var cronSchedule  = CrontabSchedule.Parse(cron);
            var instant       = _instantFactory.GetInstant(cronSchedule);

            var lastExecutionTime = recurringJob.ContainsKey("LastExecution")
                ? JobHelper.DeserializeDateTime(recurringJob["LastExecution"])
                : (DateTime?)null;

            if (instant.GetMatches(lastExecutionTime).Any())
            {
                var state = new EnqueuedState {
                    Reason = "Triggered by recurring job scheduler"
                };
                var jobId = _client.Create(job, state);

                if (String.IsNullOrEmpty(jobId))
                {
                    Logger.DebugFormat(
                        "Recurring job '{0}' execution at '{1}' has been canceled.",
                        recurringJobId,
                        instant.UtcTime);
                }

                connection.SetRangeInHash(
                    String.Format("recurring-job:{0}", recurringJobId),
                    new Dictionary <string, string>
                {
                    { "LastExecution", JobHelper.SerializeDateTime(instant.UtcTime) },
                    { "LastJobId", jobId ?? String.Empty },
                });
            }

            connection.SetRangeInHash(
                String.Format("recurring-job:{0}", recurringJobId),
                new Dictionary <string, string>
            {
                {
                    "NextExecution",
                    JobHelper.SerializeDateTime(instant.NextOccurrence)
                }
            });
        }