replace saving background tasks in DB

This commit is contained in:
vfedosevich 2013-05-23 09:42:55 +03:00
parent 3353de1e5d
commit e7d5bf0c7e
52 changed files with 1423 additions and 1306 deletions

View file

@ -40,23 +40,25 @@ namespace WebsitePanel.EnterpriseServer.Tasks
public override void OnComplete()
{
if (!TaskManager.HasErrors)
BackgroundTask topTask = TaskController.GetTopTask();
if (!TaskManager.HasErrors(topTask))
{
// Send user add notification
if (TaskManager.TaskSource == "USER" &&
TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
if (topTask.Source == "USER" &&
topTask.TaskName == "ADD" && topTask.ItemId > 0)
{
SendAddUserNotification();
}
// Send hosting package add notification
if (TaskManager.TaskSource == "HOSTING_SPACE"
&& TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
if (topTask.Source == "HOSTING_SPACE"
&& topTask.TaskName == "ADD" && topTask.ItemId > 0)
{
SendAddPackageNotification();
}
// Send hosting package add notification
if (TaskManager.TaskSource == "HOSTING_SPACE_WR"
&& TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
if (topTask.Source == "HOSTING_SPACE_WR"
&& topTask.TaskName == "ADD" && topTask.ItemId > 0)
{
SendAddPackageWithResourcesNotification();
}
@ -76,10 +78,13 @@ namespace WebsitePanel.EnterpriseServer.Tasks
{
try
{
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
BackgroundTask topTask = TaskController.GetTopTask();
bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false);
if (sendLetter)
{
int sendResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, true);
int sendResult = PackageController.SendPackageSummaryLetter(topTask.ItemId, null, null, true);
CheckSmtpResult(sendResult);
}
}
@ -93,9 +98,12 @@ namespace WebsitePanel.EnterpriseServer.Tasks
{
try
{
int userId = (int)TaskManager.TaskParameters["UserId"];
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
bool signup = (bool)TaskManager.TaskParameters["Signup"];
BackgroundTask topTask = TaskController.GetTopTask();
int userId = Utils.ParseInt(topTask.GetParamValue("UserId").ToString(), 0);
bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false);
bool signup = Utils.ParseBool(topTask.GetParamValue("Signup"), false);
// send space letter if enabled
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.PACKAGE_SUMMARY_LETTER);
if (sendLetter
@ -103,7 +111,7 @@ namespace WebsitePanel.EnterpriseServer.Tasks
&& Utils.ParseBool(settings["EnableLetter"], false))
{
// send letter
int smtpResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, signup);
int smtpResult = PackageController.SendPackageSummaryLetter(topTask.ItemId, null, null, signup);
CheckSmtpResult(smtpResult);
}
}
@ -117,8 +125,11 @@ namespace WebsitePanel.EnterpriseServer.Tasks
{
try
{
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
int userId = TaskManager.ItemId;
BackgroundTask topTask = TaskController.GetTopTask();
bool sendLetter = Utils.ParseBool(topTask.GetParamValue("SendLetter"), false);
int userId = topTask.ItemId;
// send account letter if enabled
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.ACCOUNT_SUMMARY_LETTER);
if (sendLetter

View file

@ -0,0 +1,174 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace WebsitePanel.EnterpriseServer
{
public class TaskController
{
public static BackgroundTask GetTask(string taskId)
{
BackgroundTask task = ObjectUtils.FillObjectFromDataReader<BackgroundTask>(
DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId));
task.Params = GetTaskParams(task.Id);
return task;
}
public static List<BackgroundTask> GetTasks()
{
return ObjectUtils.CreateListFromDataReader<BackgroundTask>(
DataProvider.GetBackgroundTasks(SecurityContext.User.UserId));
}
public static BackgroundTask GetTopTask()
{
BackgroundTask task = ObjectUtils.FillObjectFromDataReader<BackgroundTask>(
DataProvider.GetBackgroundTopTask(SecurityContext.User.UserId));
task.Params = GetTaskParams(task.Id);
return task;
}
public static void AddTask(BackgroundTask task)
{
int taskId = DataProvider.AddBackgroundTask(task.TaskId, task.ScheduleId, task.PackageId, task.UserId,
task.EffectiveUserId, task.TaskName, task.ItemId, task.ItemName,
task.StartDate, task.IndicatorCurrent, task.IndicatorMaximum,
task.MaximumExecutionTime, task.Source, task.Severity, task.Completed,
task.NotifyOnComplete, task.Status);
AddTaskParams(taskId, task.Params);
DataProvider.AddBackgroundTaskStack(taskId);
}
public static void UpdateTask(BackgroundTask task)
{
DataProvider.UpdateBackgroundTask(task.Id, task.ScheduleId, task.PackageId, task.TaskName, task.ItemId,
task.ItemName, task.FinishDate, task.IndicatorCurrent,
task.IndicatorMaximum, task.MaximumExecutionTime, task.Source,
task.Severity, task.Completed, task.NotifyOnComplete, task.Status);
AddTaskParams(task.Id, task.Params);
if (task.Completed)
{
DeleteTaskStack(task.Id);
}
}
public static void DeleteTaskStack(int taskId)
{
DataProvider.DeleteBackgroundTaskParams(taskId);
}
public static void AddTaskParams(int taskId, IList<BackgroundTaskParameter> parameters)
{
foreach (BackgroundTaskParameter param in SerializeParams(parameters))
{
DataProvider.AddBackgroundTaskParam(taskId, param.Name, param.SerializerValue);
}
}
public static IList<BackgroundTaskParameter> GetTaskParams(int taskId)
{
List<BackgroundTaskParameter> parameters = ObjectUtils.CreateListFromDataReader<BackgroundTaskParameter>(
DataProvider.GetBackgroundTaskParams(taskId));
return DeserializeParams(parameters);
}
public static void AddLog(BackgroundTaskLogRecord log)
{
DataProvider.AddBackgroundTaskLog(log.TaskId, log.Date, log.ExceptionStackTrace, log.InnerTaskStart,
log.Severity, log.Text, log.TextIdent, BuildParametersXml(log.TextParameters));
}
public static List<BackgroundTaskLogRecord> GetLogs(int taskId, DateTime startLogTime)
{
List<BackgroundTaskLogRecord> logs = ObjectUtils.CreateListFromDataReader<BackgroundTaskLogRecord>(
DataProvider.GetBackgroundTaskLogs(taskId, startLogTime));
foreach (BackgroundTaskLogRecord log in logs)
{
log.TextParameters = ReBuildParametersXml(log.XmlParameters);
}
return logs;
}
private static IList<BackgroundTaskParameter> SerializeParams(IList<BackgroundTaskParameter> parameters)
{
foreach (BackgroundTaskParameter param in parameters)
{
XmlSerializer serializer = new XmlSerializer(param.Value.GetType());
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms, param.Value);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
param.SerializerValue = sr.ReadToEnd();
}
return parameters;
}
private static IList<BackgroundTaskParameter> DeserializeParams(IList<BackgroundTaskParameter> parameters)
{
foreach (BackgroundTaskParameter param in parameters)
{
XmlSerializer deserializer = new XmlSerializer(param.Value.GetType());
StringReader sr = new StringReader(param.SerializerValue);
param.Value = deserializer.Deserialize(sr);
}
return parameters;
}
private static string BuildParametersXml(string[] parameters)
{
XmlDocument xmlDoc = new XmlDocument();
XmlElement nodeProps = xmlDoc.CreateElement("parameters");
if (parameters != null)
{
foreach (string parameter in parameters)
{
XmlElement nodeProp = xmlDoc.CreateElement("parameter");
nodeProp.SetAttribute("value", parameter);
nodeProps.AppendChild(nodeProp);
}
}
return nodeProps.OuterXml;
}
private static string[] ReBuildParametersXml(string parameters)
{
string[] textParameters = new string[] {};
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(parameters);
if (xmlDoc != null)
{
int index = 0;
foreach (XmlNode xmlParameter in xmlDoc.SelectNodes("parameters/parameter"))
{
textParameters[index] = xmlParameter.Attributes.GetNamedItem("value").Value;
index++;
}
}
return textParameters;
}
}
}

View file

@ -42,7 +42,6 @@ namespace WebsitePanel.EnterpriseServer
{
public class TaskManager
{
private static Hashtable tasks = Hashtable.Synchronized(new Hashtable());
private static Hashtable eventHandlers = null;
// purge timer, used for killing old tasks from the hash
@ -51,81 +50,120 @@ namespace WebsitePanel.EnterpriseServer
60000, // start from 1 minute
60000); // invoke each minute
private static BackgroundTask RootTask
{
get { return TasksStack.Count > 0 ? TasksStack[0] : null; }
}
private static BackgroundTask TopTask
{
get { return TasksStack.Count > 0 ? TasksStack[TasksStack.Count - 1] : null; }
}
private static List<BackgroundTask> TasksStack
{
get
{
List<BackgroundTask> stack = (List<BackgroundTask>)Thread.GetData(Thread.GetNamedDataSlot("BackgroundTasksStack"));
if (stack == null)
{
stack = new List<BackgroundTask>();
Thread.SetData(Thread.GetNamedDataSlot("BackgroundTasksStack"), stack);
}
return stack;
}
}
public static void StartTask(string source, string taskName)
{
StartTask(null, source, taskName, null);
StartTask(source, taskName, 0);
}
public static void StartTask(string source, string taskName, int itemId)
{
StartTask(source, taskName, 0, new List<BackgroundTaskParameter>());
}
public static void StartTask(string source, string taskName, int itemId, BackgroundTaskParameter parameter)
{
StartTask(source, taskName, null, itemId, parameter);
}
public static void StartTask(string source, string taskName, int itemId, IList<BackgroundTaskParameter> parameters)
{
StartTask(source, taskName, null, itemId, parameters);
}
public static void StartTask(string source, string taskName, object itemName)
{
StartTask(null, source, taskName, itemName);
StartTask(source, taskName, itemName, 0);
}
public static void StartTask(string taskId, string source, string taskName, object itemName)
public static void StartTask(string source, string taskName, object itemName, int itemId)
{
// create new task object
BackgroundTask task = new BackgroundTask();
task.TaskId = String.IsNullOrEmpty(taskId) ? Guid.NewGuid().ToString("N") : taskId;
task.UserId = SecurityContext.User.UserId;
task.EffectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : task.UserId;
task.StartDate = DateTime.Now;
task.Source = source;
task.TaskName = taskName;
task.ItemName = itemName != null ? itemName.ToString() : "";
task.Severity = 0; //info
task.TaskThread = Thread.CurrentThread;
StartTask(source, taskName, itemName, itemId, new List<BackgroundTaskParameter>());
}
// new "parent" task?
if (TasksStack.Count == 0)
public static void StartTask(string source, string taskName, object itemName, BackgroundTaskParameter parameter)
{
StartTask(source, taskName, itemName, 0, parameter);
}
public static void StartTask(string source, string taskName, object itemName, IList<BackgroundTaskParameter> parameters)
{
StartTask(source, taskName, itemName, 0, parameters);
}
public static void StartTask(string source, string taskName, object itemName, int itemId, BackgroundTaskParameter parameter)
{
StartTask(source, taskName, itemName, itemId, 0, parameter);
}
public static void StartTask(string source, string taskName, object itemName, int itemId, IList<BackgroundTaskParameter> parameters)
{
StartTask(source, taskName, itemName, itemId, 0, 0, -1, parameters);
}
public static void StartTask(string source, string taskName, object itemName, int itemId, int packageId, BackgroundTaskParameter parameter)
{
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
if (parameter != null)
{
// register task globally
tasks[task.TaskId] = task;
parameters.Add(parameter);
}
else
{
// child task
// add log record to the root task
BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord();
logRecord.InnerTaskStart = true;
logRecord.Text = source + "_" + taskName;
logRecord.TextParameters = new string[] { itemName != null ? itemName.ToString() : "" };
logRecord.TextIdent = TasksStack.Count - 1;
RootTask.LogRecords.Add(logRecord);
// change log records destination
// for nested task
task.LogRecords = RootTask.LogRecords;
StartTask(source, taskName, itemName, itemId, 0, packageId, -1, parameters);
}
public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId)
{
StartTask(taskId, source, taskName, itemName, itemId, 0, 0, -1, new List<BackgroundTaskParameter>());
}
public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId, int packageId)
{
StartTask(taskId, source, taskName, itemName, itemId, 0, packageId, -1, new List<BackgroundTaskParameter>());
}
public static void StartTask(string source, string taskName, object itemName, int itemId,
int scheduleId, int packageId, int maximumExecutionTime, IList<BackgroundTaskParameter> parameters)
{
StartTask(null, source, taskName, itemName, itemId, scheduleId, packageId, maximumExecutionTime, new List<BackgroundTaskParameter>());
}
public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId,
int scheduleId, int packageId, int maximumExecutionTime, IList<BackgroundTaskParameter> parameters)
{
if (String.IsNullOrEmpty(taskId))
{
taskId = Guid.NewGuid().ToString("N");
}
int userId = SecurityContext.User.UserId;
int effectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : userId;
String itemNameStr = itemName != null ? itemName.ToString() : String.Empty;
BackgroundTask task = new BackgroundTask(taskId, userId, effectiveUserId, source, taskName, itemNameStr,
itemId, scheduleId, packageId, maximumExecutionTime, parameters);
List<BackgroundTask> tasks = TaskController.GetTasks();
if (tasks.Count > 0)
{
BackgroundTask rootTask = tasks[0];
BackgroundTaskLogRecord log = new BackgroundTaskLogRecord(
rootTask.Id,
tasks.Count - 1,
true,
String.Format("{0}_{1}", source, taskName),
new string[] {itemNameStr});
TaskController.AddLog(log);
}
// call event handler
CallTaskEventHandler(task, false);
// push task on the stack
TasksStack.Add(task);
TaskController.AddTask(task);
}
public static void WriteParameter(string parameterName, object parameterValue)
@ -150,8 +188,11 @@ namespace WebsitePanel.EnterpriseServer
{
// ERROR
WriteLogRecord(2, ex.Message, ex.StackTrace);
return new Exception((TopTask != null) ? String.Format("Error executing '{0}' task on '{1}' {2}",
TopTask.TaskName, TopTask.ItemName, TopTask.Source) : String.Format("Error executing task"), ex);
BackgroundTask topTask = TaskController.GetTopTask();
return new Exception((topTask != null) ? String.Format("Error executing '{0}' task on '{1}' {2}",
topTask.TaskName, topTask.ItemName, topTask.Source) : String.Format("Error executing task"), ex);
}
public static void WriteError(Exception ex, string text, params string[] textParameters)
@ -176,63 +217,124 @@ namespace WebsitePanel.EnterpriseServer
private static void WriteLogRecord(int severity, string text, string stackTrace, params string[] textParameters)
{
BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord();
logRecord.Severity = severity;
logRecord.Text = text;
logRecord.TextParameters = textParameters;
logRecord.TextIdent = TasksStack.Count - 1;
logRecord.ExceptionStackTrace = stackTrace;
if (RootTask != null)
List<BackgroundTask> tasks = TaskController.GetTasks();
if (tasks.Count > 0)
{
RootTask.LogRecords.Add(logRecord);
RootTask.LastLogRecord = logRecord;
BackgroundTask rootTask = tasks[0];
// change entire task severity
if (severity > RootTask.Severity)
RootTask.Severity = severity;
BackgroundTaskLogRecord log = new BackgroundTaskLogRecord(
rootTask.Id,
tasks.Count - 1,
false,
text,
stackTrace,
textParameters);
TaskController.AddLog(log);
if (severity > rootTask.Severity)
{
rootTask.Severity = severity;
TaskController.UpdateTask(rootTask);
}
}
}
public static void CompleteTask()
{
if (TasksStack.Count == 0)
List<BackgroundTask> tasks = TaskController.GetTasks();
if (tasks.Count == 0)
return;
BackgroundTask topTask = TaskController.GetTopTask();
// call event handler
CallTaskEventHandler(TopTask, true);
CallTaskEventHandler(topTask, true);
// finish task
TopTask.FinishDate = DateTime.Now;
TopTask.Completed = true;
topTask.FinishDate = DateTime.Now;
topTask.Completed = true;
// write task execution result to database
if (TasksStack.Count == 1) // single task
if (tasks.Count == 1) // single task
{
// unregister task globally
// tasks.Remove(TopTask.TaskId);
// write to database
string itemName = TopTask.ItemName != null ? TopTask.ItemName.ToString() : null;
string executionLog = FormatExecutionLog(TopTask);
UserInfo user = UserController.GetUserInternally(TopTask.UserId);
topTask.Logs = TaskController.GetLogs(topTask.Id, topTask.StartDate);
string executionLog = FormatExecutionLog(topTask);
UserInfo user = UserController.GetUserInternally(topTask.UserId);
string username = user != null ? user.Username : null;
AuditLog.AddAuditLogRecord(TopTask.TaskId, TopTask.Severity, TopTask.UserId,
username, TopTask.PackageId, TopTask.ItemId,
itemName, TopTask.StartDate, TopTask.FinishDate, TopTask.Source,
TopTask.TaskName, executionLog);
AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.UserId,
username, topTask.PackageId, topTask.ItemId,
topTask.ItemName, topTask.StartDate, topTask.FinishDate, topTask.Source,
topTask.TaskName, executionLog);
}
// update last finish time
SchedulerJob schedule = SchedulerController.GetScheduleComplete(TopTask.ItemId);
if (schedule != null)
TaskController.UpdateTask(topTask);
}
public static void UpdateParam(String name, Object value)
{
BackgroundTask topTask = TaskController.GetTopTask();
if (topTask == null)
return;
topTask.UpdateParamValue(name, value);
TaskController.UpdateTask(topTask);
}
public static int ItemId
{
set
{
schedule.ScheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
BackgroundTask topTask = TaskController.GetTopTask();
if (topTask == null)
return;
topTask.ItemId = value;
TaskController.UpdateTask(topTask);
}
}
public static String ItemName
{
set
{
BackgroundTask topTask = TaskController.GetTopTask();
if (topTask == null)
return;
topTask.ItemName = value;
TaskController.UpdateTask(topTask);
}
}
public static void UpdateParams(Hashtable parameters)
{
BackgroundTask topTask = TaskController.GetTopTask();
if (topTask == null)
return;
foreach (string key in parameters.Keys)
{
topTask.UpdateParamValue(key, parameters[key]);
}
// remove task from the stack
TasksStack.RemoveAt(TasksStack.Count - 1);
TaskController.UpdateTask(topTask);
}
static string FormatExecutionLog(BackgroundTask task)
@ -244,19 +346,19 @@ namespace WebsitePanel.EnterpriseServer
// parameters
writer.WriteStartElement("parameters");
foreach (string name in task.Parameters.Keys)
foreach (BackgroundTaskParameter param in task.Params)
{
string val = task.Parameters[name] != null ? task.Parameters[name].ToString() : "";
writer.WriteStartElement("parameter");
writer.WriteAttributeString("name", name);
writer.WriteString(val);
writer.WriteAttributeString("name", param.Name);
writer.WriteString(param.Value.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement(); // parameters
// records
writer.WriteStartElement("records");
foreach (BackgroundTaskLogRecord record in task.LogRecords)
foreach (BackgroundTaskLogRecord record in task.Logs)
{
writer.WriteStartElement("record");
writer.WriteAttributeString("severity", record.Severity.ToString());
@ -289,133 +391,84 @@ namespace WebsitePanel.EnterpriseServer
static void PurgeCompletedTasks(object obj)
{
// remove completed tasks
List<string> completedTasks = new List<string>();
foreach (BackgroundTask task in tasks.Values)
List<BackgroundTask> tasks = TaskController.GetTasks();
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)
{
// terminate task
try
{
task.TaskThread.Abort();
}
catch
{
// nope
}
task.Status = BackgroundTaskStatus.Abort;
// add to the list
completedTasks.Add(task.TaskId);
}
if ((task.FinishDate != DateTime.MinValue
&& ((TimeSpan)(DateTime.Now - task.FinishDate)).TotalMinutes > 2))
{
// add to the list
completedTasks.Add(task.TaskId);
TaskController.UpdateTask(task);
}
}
// remove tasks
foreach (string taskId in completedTasks)
{
BackgroundTask task = GetTask(taskId);
if (task != null)
{
// update last finish time
SchedulerJob schedule = SchedulerController.GetScheduleComplete(task.ItemId);
if (schedule != null)
{
schedule.ScheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
}
}
tasks.Remove(taskId);
}
}
public static int PackageId
{
get { return TopTask.PackageId; }
set { TopTask.PackageId = value; }
}
public static int ItemId
{
get { return TopTask.ItemId; }
set { TopTask.ItemId = value; }
}
public static string ItemName
{
get { return TopTask.ItemName; }
set { TopTask.ItemName = value; }
}
public static string TaskName
{
get { return TopTask.TaskName; }
}
public static string TaskSource
{
get { return TopTask.Source; }
}
public static int IndicatorMaximum
{
get { return TopTask.IndicatorMaximum; }
set { TopTask.IndicatorMaximum = value; }
set
{
BackgroundTask topTask = TaskController.GetTopTask();
topTask.IndicatorMaximum = value;
TaskController.UpdateTask(topTask);
}
}
public static int IndicatorCurrent
{
get { return TopTask.IndicatorCurrent; }
set { TopTask.IndicatorCurrent = value; }
get
{
return TaskController.GetTopTask().IndicatorCurrent;
}
set
{
BackgroundTask topTask = TaskController.GetTopTask();
topTask.IndicatorCurrent = value;
TaskController.UpdateTask(topTask);
}
}
public static int MaximumExecutionTime
{
get { return TopTask.MaximumExecutionTime; }
set { TopTask.MaximumExecutionTime = value; }
get
{
return TaskController.GetTopTask().MaximumExecutionTime;
}
set
{
BackgroundTask topTask = TaskController.GetTopTask();
topTask.MaximumExecutionTime = value;
TaskController.UpdateTask(topTask);
}
}
public static int ScheduleId
public static bool HasErrors(BackgroundTask task)
{
get { return TopTask.ScheduleId; }
set { TopTask.ScheduleId = value; }
}
public static bool HasErrors
{
get { return (TopTask.Severity == 2); }
return task.Severity == 2;
}
public static BackgroundTask GetTask(string taskId)
{
BackgroundTask task = (BackgroundTask)tasks[taskId];
BackgroundTask task = TaskController.GetTask(taskId);
if (task == null)
return null;
task.LastLogRecords.Clear();
return task;
}
public static BackgroundTask GetTaskWithLogRecords(string taskId, DateTime startLogTime)
{
BackgroundTask task = GetTask(taskId);
if (task == null)
return null;
// fill log records
foreach (BackgroundTaskLogRecord record in task.LogRecords)
{
if (record.Date >= startLogTime)
task.LastLogRecords.Add(record);
}
task.Logs = TaskController.GetLogs(task.Id, startLogTime);
return task;
}
@ -425,7 +478,7 @@ namespace WebsitePanel.EnterpriseServer
Dictionary<int, BackgroundTask> scheduledTasks = new Dictionary<int, BackgroundTask>();
try
{
foreach (BackgroundTask task in tasks.Values)
foreach (BackgroundTask task in TaskController.GetTasks())
{
if (task.ScheduleId > 0
&& !task.Completed
@ -441,7 +494,8 @@ namespace WebsitePanel.EnterpriseServer
public static void SetTaskNotifyOnComplete(string taskId)
{
BackgroundTask task = (BackgroundTask)tasks[taskId];
BackgroundTask task = GetTask(taskId);
if (task == null)
return;
@ -450,101 +504,46 @@ namespace WebsitePanel.EnterpriseServer
public static void StopTask(string taskId)
{
BackgroundTask task = (BackgroundTask)tasks[taskId];
BackgroundTask task = GetTask(taskId);
if (task == null)
return;
try
{
task.TaskThread.Abort();
}
catch
{
// nope
}
// update last finish time
SchedulerJob schedule = SchedulerController.GetScheduleComplete(task.ItemId);
if (schedule != null)
{
schedule.ScheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
}
// remove it from stack
tasks.Remove(taskId);
}
public static Hashtable TaskParameters
{
get { return TopTask.Parameters; }
}
public static int GetTasksNumber()
{
return tasks.Count;
task.Status = BackgroundTaskStatus.Abort;
TaskController.UpdateTask(task);
}
public static List<BackgroundTask> GetUserTasks(int userId)
{
List<BackgroundTask> list = new List<BackgroundTask>();
int effectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : SecurityContext.User.UserId;
Dictionary<int, BackgroundTask> scheduledTasks = GetScheduledTasks();
// try to get user first
UserInfo user = UserController.GetUser(userId);
if (user == null)
return list; // prohibited user
List<ScheduleInfo> scheduleList = SchedulerController.GetRunningSchedules();
foreach (var scheduleInfo in scheduleList)
// get user tasks
foreach (BackgroundTask task in TaskController.GetTasks())
{
if (effectiveUserId == userId && scheduleInfo.LastRun > scheduleInfo.LastFinish)
{
if (scheduledTasks.ContainsKey(scheduleInfo.ScheduleId) && !scheduledTasks[scheduleInfo.ScheduleId].Completed)
{
list.Add(scheduledTasks[scheduleInfo.ScheduleId]);
}
else
{
list.Add(new BackgroundTask
{
TaskId = "",
ItemId = scheduleInfo.ScheduleId,
StartDate = scheduleInfo.LastRun,
TaskName = scheduleInfo.ScheduleName,
UserId = SecurityContext.User.UserId,
Source = "RUN_SCHEDULE",
Severity = 0,
ItemName = scheduleInfo.ScheduleName,
Completed = false
});
}
}
if (task.EffectiveUserId == userId && !task.Completed)
list.Add(task);
}
return list;
}
public static List<BackgroundTask> GetUserCompletedTasks(int userId)
{
// get user tasks
List<BackgroundTask> list = GetUserTasks(userId);
return new List<BackgroundTask>();
}
// extract completed only
List<BackgroundTask> completedTasks = new List<BackgroundTask>();
foreach (BackgroundTask task in list)
{
if (task.Completed && task.NotifyOnComplete)
{
// add to the list
completedTasks.Add(task);
// remove from hash
tasks.Remove(task.TaskId);
}
}
return completedTasks;
public static int GetTasksNumber()
{
return TaskController.GetTasks().Count;
}
#region Private Helpers
private static void CallTaskEventHandler(BackgroundTask task, bool onComplete)
{
string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName);
@ -630,6 +629,7 @@ namespace WebsitePanel.EnterpriseServer
List<string> handlersList = (List<string>)eventHandlers[fullTaskName];
return handlersList == null ? null : handlersList.ToArray();
}
#endregion
@ -677,14 +677,6 @@ namespace WebsitePanel.EnterpriseServer
CompleteResultTask(null);
}
public static T StartResultTask<T>(string source, string taskName, Guid taskId) where T : ResultObject, new()
{
StartTask(taskId.ToString(), source, taskName, null);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName) where T : ResultObject, new()
{
StartTask(source, taskName);
@ -693,6 +685,69 @@ namespace WebsitePanel.EnterpriseServer
return res;
}
public static T StartResultTask<T>(string source, string taskName, object itemName) where T : ResultObject, new()
{
StartTask(source, taskName, itemName);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, object itemName, int packageId) where T : ResultObject, new()
{
StartTask(source, taskName, itemName, 0, packageId, null);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, int packageId) where T : ResultObject, new()
{
StartTask(source, taskName, null, 0, packageId, null);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, int itemId, BackgroundTaskParameter parameter) where T : ResultObject, new()
{
StartTask(source, taskName, itemId, parameter);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, int itemId, IList<BackgroundTaskParameter> parameters) where T : ResultObject, new()
{
StartTask(source, taskName, itemId, parameters);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, int itemId, object itemName, int packageId) where T : ResultObject, new()
{
StartTask(source, taskName, itemName, itemId, packageId, null);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, Guid taskId, object itemName, int packageId) where T : ResultObject, new()
{
StartTask(taskId.ToString(), source, taskName, itemName, 0, packageId);
T res = new T();
res.IsSuccess = true;
return res;
}
public static T StartResultTask<T>(string source, string taskName, Guid taskId, int itemId, object itemName, int packageId) where T : ResultObject, new()
{
StartTask(taskId.ToString(), source, taskName, itemName, itemId, packageId);
T res = new T();
res.IsSuccess = true;
return res;
}
#endregion
}