예제 #1
0
        /// <summary>
        ///     Check setting file and reset jobs if changed.
        /// </summary>
        /// <param name="settingPath">setting file path.</param>
        /// <param name="nextCheckupInterval">next checkup time by minute interval</param>
        public static void CheckupSetting(string settingPath, int nextCheckupInterval)
        {
            var settingChanged = false;

            try
            {
                var setting = FileManager.ReadFileSafely(settingPath);

                if (string.IsNullOrEmpty(setting))
                {
                    Nlogger.Warn("Setting file not found!");
                    CreateSettingFile(settingPath);
                    CheckupSetting(settingPath, nextCheckupInterval);
                    return;
                }

                if (setting.Equals(JsonSetting, StringComparison.OrdinalIgnoreCase))
                {
                    Nlogger.Info("Setting was not changed.");
                    return;
                }
                Nlogger.Info("Setting was changed, reset jobs...");
                settingChanged = true;

                // clear old jobs
                ClearAllRecurringJobs();
                PurgeJobs();
                //
                // Add new jobs from setting file
                JsonSetting = setting;
                Setting     = DeserializeFromJson(JsonSetting);

                RegisterJobs();

                Nlogger.Info("Jobs are ready to work.");
            }
            catch (Exception exp)
            {
                Nlogger.Fatal(exp);
            }
            finally
            {
                if (settingChanged)
                {
                    RecurringJob.AddOrUpdate(() => CheckupSetting(settingPath, nextCheckupInterval),
                                             Cron.MinuteInterval(nextCheckupInterval), TimeZoneInfo.Local);
                }
            }
        }
예제 #2
0
        public async Task <dynamic> GetConfigAsync(string configCategory)
        {
            var settings = await _settingsRepository.FindByAsync(s => s.Category == configCategory);

            dynamic config = new ExpandoObject();

            foreach (var setting in settings)
            {
                var wrappedSetting = new SettingWrapper(setting);
                ((IDictionary <string, object>)config).Add(setting.Key, wrappedSetting);
            }

            var result = new ConfigFactory().GetConfig(configCategory, config);

            return(result);
        }
예제 #3
0
        public static SettingWrapper DeserializeFromJson(string json)
        {
            var result = new SettingWrapper();

            try
            {
                var asm = Assembly.GetAssembly(typeof(IJob));
                json = json.Replace("{#version}", asm.GetName().Version.ToString(3));
                var setting = JsonConvert.DeserializeObject <JobsSetting>(json);

                result.Jobs = new List <IJob>();
                result.NotificationServices = new List <INotificationService>();
                result.Notifications        = setting.Notifications;

                if (setting.Jobs == null || setting.NotificationServices == null)
                {
                    return(null);
                }
                //
                // parse notification services to real type
                foreach (JObject ns in setting.NotificationServices)
                {
                    try
                    {
                        var serviceType = ns.GetValue("notificationType")?.ToString();
                        if (string.IsNullOrWhiteSpace(serviceType))
                        {
                            continue;
                        }

                        var service = asm.GetTypes()
                                      .FirstOrDefault(t => t.Name.Equals(serviceType, StringComparison.OrdinalIgnoreCase));
                        var serviceObj = (INotificationService)ns.ToObject(service);
                        serviceObj?.Initial();
                        result.NotificationServices.Add(serviceObj);
                    }
                    catch (Exception e)
                    {
                        Nlogger.Error(e);
                    }
                }
                //
                // parse jobs to real type
                foreach (JObject j in setting.Jobs)
                {
                    try
                    {
                        var jobTypeName = j.GetValue("jobType")?.ToString();

                        if (string.IsNullOrWhiteSpace(jobTypeName))
                        {
                            continue;
                        }

                        var jobType = asm.GetTypes()
                                      .FirstOrDefault(t => t.Name.Equals(jobTypeName, StringComparison.OrdinalIgnoreCase));
                        var jobObj = (IJob)j.ToObject(jobType);
                        //
                        // if the job hasn't any notification and exist at last one public notification
                        // then insert public notifications
                        if (jobObj != null && jobObj.Notifications?.Any() != true &&
                            setting.Notifications?.Any() == true)
                        {
                            jobObj.Notifications = setting.Notifications;
                        }
                        result.Jobs.Add(jobObj);
                    }
                    catch (Exception e)
                    {
                        Nlogger.Error(e);
                    }
                }
            }
            catch (Exception exp)
            {
                Nlogger.Fatal(exp);
            }

            return(result);
        }