diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs index 9da7a64b..61ac1666 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/Scheduler.cs @@ -40,9 +40,9 @@ namespace WebsitePanel.EnterpriseServer public sealed class Scheduler { - static SchedulerJob nextSchedule = null; + public static SchedulerJob nextSchedule = null; - // main timer + // main timer and put it to sleep static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule), null, Timeout.Infinite, @@ -92,6 +92,8 @@ namespace WebsitePanel.EnterpriseServer // this will put the timer to sleep scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); + System.Threading.Thread.Sleep(1000); + // run immediately RunNextSchedule(null); } @@ -122,31 +124,47 @@ namespace WebsitePanel.EnterpriseServer static void RunSchedule(SchedulerJob schedule, bool changeNextRun) { - // update next run (if required) - if (changeNextRun) + + + try { - SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo); + // update next run (if required) + if (changeNextRun) + { + SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo); + } + + // disable run once task + if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime) + schedule.ScheduleInfo.Enabled = false; + + Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); + if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) + // this task should be run, so + // update its last run + schedule.ScheduleInfo.LastRun = DateTime.Now; + + // update schedule + SchedulerController.UpdateSchedule(schedule.ScheduleInfo); + + // skip execution if the current task is still running + scheduledTasks = TaskManager.GetScheduledTasks(); + if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) + { + // run the schedule in the separate thread + schedule.Run(); + } + } + catch (Exception Ex) + { + try + { + TaskManager.WriteError(string.Format("RunSchedule Error : {0}", Ex.Message)); + } + catch (Exception) + { + } } - - // disable run once task - if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime) - schedule.ScheduleInfo.Enabled = false; - - Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); - if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - // this task should be run, so - // update its last run - schedule.ScheduleInfo.LastRun = DateTime.Now; - - // update schedule - SchedulerController.UpdateSchedule(schedule.ScheduleInfo); - - // skip execution if the current task is still running - if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId)) - return; - - // run the schedule in the separate thread - schedule.Run(); } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs index 748f97cd..0fc85004 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerController.cs @@ -86,21 +86,21 @@ namespace WebsitePanel.EnterpriseServer { DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId); ScheduleInfo si = ObjectUtils.FillObjectFromDataView(ds.Tables[0].DefaultView); - return si; + return si; } - /// - /// Gets view configuration for a certain task. - /// - /// Task id for which view configuration is intended to be loeaded. - /// View configuration for the task with supplied id. - public static List GetScheduleTaskViewConfigurations(string taskId) - { - List c = ObjectUtils.CreateListFromDataReader(DataProvider.GetScheduleTaskViewConfigurations(taskId)); - return c; - } + /// + /// Gets view configuration for a certain task. + /// + /// Task id for which view configuration is intended to be loeaded. + /// View configuration for the task with supplied id. + public static List GetScheduleTaskViewConfigurations(string taskId) + { + List c = ObjectUtils.CreateListFromDataReader(DataProvider.GetScheduleTaskViewConfigurations(taskId)); + return c; + } - internal static SchedulerJob GetScheduleComplete(int scheduleId) + internal static SchedulerJob GetScheduleComplete(int scheduleId) { DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId); return CreateCompleteScheduleFromDataSet(ds); @@ -199,7 +199,7 @@ namespace WebsitePanel.EnterpriseServer nextStart = lastRun.AddSeconds(schedule.Interval); } - if(nextStart < now) + if (nextStart < now) nextStart = now; // run immediately // check if start time is in allowed interval @@ -261,7 +261,7 @@ namespace WebsitePanel.EnterpriseServer if (accountCheck < 0) return accountCheck; // check quota - if(PackageController.GetPackageQuota(schedule.PackageId, Quotas.OS_SCHEDULEDTASKS).QuotaExhausted) + if (PackageController.GetPackageQuota(schedule.PackageId, Quotas.OS_SCHEDULEDTASKS).QuotaExhausted) return BusinessErrorCodes.ERROR_OS_SCHEDULED_TASK_QUOTA_LIMIT; CalculateNextStartTime(schedule); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs index 301fa943..c29be3fd 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Scheduling/SchedulerJob.cs @@ -94,7 +94,7 @@ namespace WebsitePanel.EnterpriseServer TaskManager.ItemId = scheduleInfo.ScheduleId; TaskManager.ScheduleId = scheduleInfo.ScheduleId; TaskManager.MaximumExecutionTime = scheduleInfo.MaxExecutionTime; - + // set task parameters foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters) TaskManager.TaskParameters[prm.ParameterId] = prm.ParameterValue; @@ -119,7 +119,13 @@ namespace WebsitePanel.EnterpriseServer finally { // complete task - TaskManager.CompleteTask(); + try + { + TaskManager.CompleteTask(); + } + catch (Exception) + { + } } } }