Beispiel #1
0
        public void AddOrUpdate([NotNull] RecurringDateRangeJobOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            options.Validate();
            ValidateCronExpression(options.CronExpression);

            using (var connection = _storage.GetConnection())
            {
                var recurringJob   = new Dictionary <string, string>();
                var invocationData = InvocationData.Serialize(options.Job);

                recurringJob["Job"]        = JobHelper.ToJson(invocationData);
                recurringJob["Cron"]       = options.CronExpression;
                recurringJob["TimeZoneId"] = options.RecurringJobOptions.TimeZone.Id;
                recurringJob["Queue"]      = options.RecurringJobOptions.QueueName;

                var utcStartDate = options.StartDateTime.HasValue ? TimeZoneInfo.ConvertTime(options.StartDateTime.Value, options.RecurringJobOptions.TimeZone, TimeZoneInfo.Utc) : (DateTime?)null;
                var utcEndDate   = options.EndDateTime.HasValue ? TimeZoneInfo.ConvertTime(options.EndDateTime.Value, options.RecurringJobOptions.TimeZone, TimeZoneInfo.Utc) : (DateTime?)null;

                recurringJob["StartDate"] = JobHelper.SerializeDateTime(utcStartDate ?? DateTime.MinValue);
                recurringJob["EndDate"]   = JobHelper.SerializeDateTime(utcEndDate ?? DateTime.MaxValue);
                if (options.UseEndDateTimeComponent.HasValue)
                {
                    recurringJob[HashKeys.UseEndDateTimeComponent] = options.UseEndDateTimeComponent.ToString();
                }

                var existingJob = connection.GetAllEntriesFromHash($"{PluginConstants.JobType}:{options.RecurringJobId}");
                if (existingJob == null)
                {
                    recurringJob["CreatedAt"] = JobHelper.SerializeDateTime(DateTime.UtcNow);
                }

                using (var transaction = connection.CreateWriteTransaction())
                {
                    transaction.SetRangeInHash(
                        $"{PluginConstants.JobType}:{options.RecurringJobId}",
                        recurringJob);

                    transaction.AddToSet(PluginConstants.JobSet, options.RecurringJobId);

                    transaction.Commit();
                }
            }
        }