From bcceb95f924b47a8e4a745e8fc84a583097d1c3b Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Mon, 27 May 2013 19:10:30 +0300 Subject: [PATCH] Scheduler service fixes --- .../Scheduling/Scheduler.cs | 38 ++++++++--------- .../Tasks/TaskController.cs | 24 +++++++++-- .../Tasks/TaskManager.cs | 41 +++++++++++-------- 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs index d54c76dc..05834c09 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs @@ -42,18 +42,12 @@ namespace WebsitePanel.EnterpriseServer public sealed class Scheduler { - public static SchedulerJob nextSchedule = null; + public static SchedulerJob nextSchedule = null; + private static Timer timer = new Timer(ScheduleTasks, null, 30000, 30000); public static void Start() - { - var serviceController = new ServiceController("WebsitePanel Scheduler"); - - if (serviceController != null && serviceController.Status != ServiceControllerStatus.Running) - { - serviceController.WaitForStatus(ServiceControllerStatus.Running); - } - - ScheduleTasks(null); + { + ScheduleTasks(); } public static bool IsScheduleActive(int scheduleId) @@ -82,21 +76,23 @@ namespace WebsitePanel.EnterpriseServer TaskManager.StopTask(activeTask.TaskId); } + public static void ScheduleTasks() + { + ScheduleTasks(null); + } + public static void ScheduleTasks(object obj) { - RunManualTasks(); - nextSchedule = SchedulerController.GetNextSchedule(); - + RunManualTasks(); + nextSchedule = SchedulerController.GetNextSchedule(); + if (nextSchedule != null) - { + { if (nextSchedule.ScheduleInfo.NextRun <= DateTime.Now) - { + { RunNextSchedule(null); - } + } } - - Thread.Sleep(30000); - ScheduleTasks(null); } private static void RunManualTasks() @@ -155,14 +151,14 @@ namespace WebsitePanel.EnterpriseServer // call back for the timer function static void RunNextSchedule(object obj) // obj ignored - { + { if (nextSchedule == null) return; RunSchedule(nextSchedule, true); // schedule next task - ScheduleTasks(null); + ScheduleTasks(); } static void RunSchedule(SchedulerJob schedule, bool changeNextRun) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs index 58cf6085..29d03634 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs @@ -15,6 +15,11 @@ namespace WebsitePanel.EnterpriseServer BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId)); + if (task == null) + { + return null; + } + task.Params = GetTaskParams(task.Id); return task; @@ -27,9 +32,14 @@ namespace WebsitePanel.EnterpriseServer } public static List GetTasks() + { + return GetTasks(SecurityContext.User.UserId); + } + + public static List GetTasks(int actorId) { return ObjectUtils.CreateListFromDataReader( - DataProvider.GetBackgroundTasks(SecurityContext.User.UserId)); + DataProvider.GetBackgroundTasks(actorId)); } public static List GetTasks(Guid guid) @@ -49,6 +59,11 @@ namespace WebsitePanel.EnterpriseServer BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTopTask(SecurityContext.User.UserId, guid)); + if (task == null) + { + return null; + } + task.Params = GetTaskParams(task.Id); return task; @@ -88,7 +103,7 @@ namespace WebsitePanel.EnterpriseServer } public static void AddTaskParams(int taskId, List parameters) - { + { foreach (BackgroundTaskParameter param in SerializeParams(parameters)) { DataProvider.AddBackgroundTaskParam(taskId, param.Name, param.SerializerValue, param.TypeName); @@ -118,7 +133,7 @@ namespace WebsitePanel.EnterpriseServer { log.TextParameters = ReBuildParametersXml(log.XmlParameters); } - + return logs; } @@ -142,7 +157,7 @@ namespace WebsitePanel.EnterpriseServer return parameters; } - private static List DeserializeParams(List parameters) + private static List DeserializeParams(List parameters) { foreach (BackgroundTaskParameter param in parameters) { @@ -188,3 +203,4 @@ namespace WebsitePanel.EnterpriseServer } } } + diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs index f1806b77..15465ad3 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs @@ -153,8 +153,13 @@ namespace WebsitePanel.EnterpriseServer } int userId = SecurityContext.User.OwnerId; - int effectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : SecurityContext.User.UserId; - String itemNameStr = itemName != null ? itemName.ToString() : String.Empty; + int effectiveUserId = SecurityContext.User.IsPeer + ? userId + : SecurityContext.User.UserId; + + String itemNameStr = itemName != null + ? itemName.ToString() + : String.Empty; BackgroundTask task = new BackgroundTask(Guid, taskId, userId, effectiveUserId, source, taskName, itemNameStr, itemId, scheduleId, packageId, maximumExecutionTime, parameters); @@ -170,7 +175,7 @@ namespace WebsitePanel.EnterpriseServer tasks.Count - 1, true, String.Format("{0}_{1}", source, taskName), - new string[] {itemNameStr}); + new string[] { itemNameStr }); TaskController.AddLog(log); @@ -234,7 +239,7 @@ namespace WebsitePanel.EnterpriseServer private static void WriteLogRecord(int severity, string text, string stackTrace, params string[] textParameters) { List tasks = TaskController.GetTasks(Guid); - + if (tasks.Count > 0) { BackgroundTask rootTask = tasks[0]; @@ -287,7 +292,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = UserController.GetUserInternally(topTask.UserId); string username = user != null ? user.Username : null; - AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.UserId, + AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.EffectiveUserId, username, topTask.PackageId, topTask.ItemId, topTask.ItemName, topTask.StartDate, topTask.FinishDate, topTask.Source, topTask.TaskName, executionLog); @@ -412,7 +417,7 @@ namespace WebsitePanel.EnterpriseServer foreach (BackgroundTask task in tasks) { if (task.MaximumExecutionTime != -1 - && ((TimeSpan) (DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime) + && ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime) { task.Status = BackgroundTaskStatus.Abort; @@ -503,7 +508,7 @@ namespace WebsitePanel.EnterpriseServer public static BackgroundTask GetTaskWithLogRecords(string taskId, DateTime startLogTime) { BackgroundTask task = GetTask(taskId); - + if (task == null) return null; @@ -549,11 +554,11 @@ namespace WebsitePanel.EnterpriseServer { return; } - + task.Status = BackgroundTaskStatus.Abort; - + StopProcess(task.TaskId); - + TaskController.UpdateTask(task); } @@ -563,14 +568,14 @@ namespace WebsitePanel.EnterpriseServer { return; } - + task.Status = BackgroundTaskStatus.Abort; - + StopProcess(task.TaskId); - + TaskController.UpdateTask(task); } - + private static void StopProcess(string taskId) { var process = Process.GetProcesses().FirstOrDefault( @@ -595,8 +600,11 @@ namespace WebsitePanel.EnterpriseServer // get user tasks foreach (BackgroundTask task in TaskController.GetTasks()) { - if (task.UserId == userId && !task.Completed) + if (task.UserId == userId && !task.Completed + && task.Status == BackgroundTaskStatus.Run) + { list.Add(task); + } } return list; } @@ -698,7 +706,7 @@ namespace WebsitePanel.EnterpriseServer List handlersList = (List)eventHandlers[fullTaskName]; return handlersList == null ? null : handlersList.ToArray(); } - + #endregion @@ -821,3 +829,4 @@ namespace WebsitePanel.EnterpriseServer #endregion } } +