/// <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); } } }
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); }
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); }