update start/stop task from windows service

This commit is contained in:
vfedosevich 2013-05-23 18:18:25 +03:00
parent 8577c73c4c
commit d14b5fc01f
16 changed files with 240 additions and 93 deletions

View file

@ -1852,6 +1852,14 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("actorId", actorId));
}
public static IDataReader GetProcessBackgroundTasks(int actorId, BackgroundTaskStatus status)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetProcessBackgroundTasks",
new SqlParameter("actorId", actorId),
new SqlParameter("status", (int)status));
}
public static IDataReader GetBackgroundTopTask(int actorId)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
@ -1910,7 +1918,7 @@ namespace WebsitePanel.EnterpriseServer
public static IDataReader GetBackgroundTaskLogs(int taskId, DateTime startLogTime)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "AddBackgroundTaskLogParam",
ObjectQualifier + "GetBackgroundTaskLogs",
new SqlParameter("@taskId", taskId),
new SqlParameter("@startLogTime", startLogTime));
}
@ -1938,7 +1946,7 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@severity", severity),
new SqlParameter("@completed", completed),
new SqlParameter("@notifyOnComplete", notifyOnComplete),
new SqlParameter("@status", status));
new SqlParameter("@status", (int)status));
}

View file

@ -1456,7 +1456,7 @@ namespace WebsitePanel.EnterpriseServer
// place log record
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
parameters.Add(new BackgroundTaskParameter("Domain ID", domainId));
parameters.Add(new BackgroundTaskParameter("Domain Type", domainType.ToString()));

View file

@ -881,7 +881,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
public static LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn)
{
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
parameters.Add(new BackgroundTaskParameter("domainName", domainName));
parameters.Add(new BackgroundTaskParameter("proxyFqdn", proxyFqdn));

View file

@ -291,7 +291,7 @@ namespace WebsitePanel.EnterpriseServer
return errorCode;
// place log record
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
parameters.Add(new BackgroundTaskParameter("Organization ID", organizationId));
parameters.Add(new BackgroundTaskParameter("DomainName", domainName));

View file

@ -1268,7 +1268,7 @@ namespace WebsitePanel.EnterpriseServer
// place log record
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
parameters.Add(new BackgroundTaskParameter("Domain ID", domain.DomainId));
parameters.Add(new BackgroundTaskParameter("Domain pointer", domain.DomainName));

View file

@ -58,10 +58,8 @@ namespace WebsitePanel.EnterpriseServer
public static bool IsScheduleActive(int scheduleId)
{
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
ScheduleInfo scheduleInfo = SchedulerController.GetSchedule(scheduleId);
return scheduledTasks.ContainsKey(scheduleId) || scheduleInfo.LastRun > scheduleInfo.LastFinish;
return scheduledTasks.ContainsKey(scheduleId);
}
public static void StartSchedule(SchedulerJob schedule)
@ -85,8 +83,10 @@ namespace WebsitePanel.EnterpriseServer
public static void ScheduleTasks()
{
nextSchedule = SchedulerController.GetNextSchedule();
RunManualTasks();
nextSchedule = SchedulerController.GetNextSchedule();
// set timer
if (nextSchedule != null)
{
@ -94,9 +94,7 @@ namespace WebsitePanel.EnterpriseServer
{
// this will put the timer to sleep
scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite);
System.Threading.Thread.Sleep(1000);
Thread.Sleep(1000);
// run immediately
RunNextSchedule(null);
}
@ -106,13 +104,65 @@ namespace WebsitePanel.EnterpriseServer
TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now);
if (ts < TimeSpan.Zero)
ts = TimeSpan.Zero; // cannot be negative !
// invoke after the timespan
scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite);
}
}
}
private static void RunManualTasks()
{
var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting);
foreach (var task in tasks)
{
StartManualTask(task);
}
tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping);
foreach (var task in tasks)
{
TaskManager.StopTask(task.TaskId);
}
}
private static void StartManualTask(BackgroundTask backgroundTask)
{
new Thread(() => RunBackgroundTask(backgroundTask)) { Priority = ThreadPriority.Highest }.Start();
backgroundTask.Status = BackgroundTaskStatus.Run;
TaskController.UpdateTask(backgroundTask);
}
private static void RunBackgroundTask(BackgroundTask backgroundTask)
{
UserInfo user = PackageController.GetPackageOwner(backgroundTask.PackageId);
SecurityContext.SetThreadPrincipal(user.UserId);
var schedule = SchedulerController.GetScheduleComplete(backgroundTask.ScheduleId);
TaskManager.StartTask(backgroundTask.Source, backgroundTask.TaskName, backgroundTask.ItemName, backgroundTask.ItemId, backgroundTask.ScheduleId, backgroundTask.PackageId, backgroundTask.MaximumExecutionTime, backgroundTask.Params);
try
{
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
objTask.DoWork();
Thread.Sleep(100000);
}
catch (Exception ex)
{
TaskManager.WriteError(ex, "Error executing scheduled task");
}
finally
{
try
{
TaskManager.CompleteTask();
}
catch (Exception)
{
}
}
}
// call back for the timer function
static void RunNextSchedule(object obj) // obj ignored
{

View file

@ -31,6 +31,7 @@ using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Linq;
using WebsitePanel.EnterpriseServer.Base.Scheduling;
namespace WebsitePanel.EnterpriseServer
@ -157,30 +158,64 @@ namespace WebsitePanel.EnterpriseServer
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
if (accountCheck < 0)
return accountCheck;
SchedulerJob schedule = GetScheduleComplete(scheduleId);
if (schedule == null)
return 0;
Scheduler.StartSchedule(schedule);
var parameters = schedule.ScheduleInfo.Parameters.Select(
prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList();
var backgroundTask = new BackgroundTask(
schedule.ScheduleInfo.TaskId,
SecurityContext.User.UserId,
SecurityContext.User.IsPeer
? SecurityContext.User.OwnerId
: SecurityContext.User.UserId, "SCHEDULER", "RUN_SCHEDULE",
schedule.ScheduleInfo.ScheduleName,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.PackageId,
schedule.ScheduleInfo.MaxExecutionTime, parameters) { Status = BackgroundTaskStatus.Starting };
TaskController.AddTask(backgroundTask);
return 0;
}
public static int StopSchedule(int scheduleId)
{
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
if (accountCheck < 0)
return accountCheck;
SchedulerJob schedule = GetScheduleComplete(scheduleId);
if (schedule == null)
return 0;
Scheduler.StopSchedule(schedule);
var parameters = schedule.ScheduleInfo.Parameters.Select(
prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList();
var backgroundTask = new BackgroundTask(
schedule.ScheduleInfo.TaskId,
SecurityContext.User.UserId,
SecurityContext.User.IsPeer
? SecurityContext.User.OwnerId
: SecurityContext.User.UserId, "SCHEDULER", "STOP_SCHEDULE",
schedule.ScheduleInfo.ScheduleName,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.PackageId,
schedule.ScheduleInfo.MaxExecutionTime, parameters) { Status = BackgroundTaskStatus.Stopping };
TaskController.AddTask(backgroundTask);
return 0;
}
public static void CalculateNextStartTime(ScheduleInfo schedule)

View file

@ -89,7 +89,7 @@ namespace WebsitePanel.EnterpriseServer
UserInfo user = PackageController.GetPackageOwner(scheduleInfo.PackageId);
SecurityContext.SetThreadPrincipal(user.UserId);
IList<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters)
{
parameters.Add(new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue));

View file

@ -15,6 +15,11 @@ namespace WebsitePanel.EnterpriseServer
BackgroundTask task = ObjectUtils.FillObjectFromDataReader<BackgroundTask>(
DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId));
if (task == null)
{
return null;
}
task.Params = GetTaskParams(task.Id);
return task;
@ -26,6 +31,12 @@ namespace WebsitePanel.EnterpriseServer
DataProvider.GetBackgroundTasks(SecurityContext.User.UserId));
}
public static List<BackgroundTask> GetProcessTasks(BackgroundTaskStatus status)
{
return ObjectUtils.CreateListFromDataReader<BackgroundTask>(
DataProvider.GetProcessBackgroundTasks(SecurityContext.User.UserId, status));
}
public static BackgroundTask GetTopTask()
{
BackgroundTask task = ObjectUtils.FillObjectFromDataReader<BackgroundTask>(
@ -58,7 +69,7 @@ namespace WebsitePanel.EnterpriseServer
AddTaskParams(task.Id, task.Params);
if (task.Completed)
if (task.Completed || task.Status == BackgroundTaskStatus.Abort)
{
DeleteTaskStack(task.Id);
}
@ -66,10 +77,10 @@ namespace WebsitePanel.EnterpriseServer
public static void DeleteTaskStack(int taskId)
{
DataProvider.DeleteBackgroundTaskParams(taskId);
DataProvider.DeleteBackgroundTaskStack(taskId);
}
public static void AddTaskParams(int taskId, IList<BackgroundTaskParameter> parameters)
public static void AddTaskParams(int taskId, List<BackgroundTaskParameter> parameters)
{
foreach (BackgroundTaskParameter param in SerializeParams(parameters))
{
@ -77,7 +88,7 @@ namespace WebsitePanel.EnterpriseServer
}
}
public static IList<BackgroundTaskParameter> GetTaskParams(int taskId)
public static List<BackgroundTaskParameter> GetTaskParams(int taskId)
{
List<BackgroundTaskParameter> parameters = ObjectUtils.CreateListFromDataReader<BackgroundTaskParameter>(
DataProvider.GetBackgroundTaskParams(taskId));
@ -104,8 +115,13 @@ namespace WebsitePanel.EnterpriseServer
return logs;
}
private static IList<BackgroundTaskParameter> SerializeParams(IList<BackgroundTaskParameter> parameters)
private static List<BackgroundTaskParameter> SerializeParams(List<BackgroundTaskParameter> parameters)
{
if (parameters == null)
{
return new List<BackgroundTaskParameter>();
}
foreach (BackgroundTaskParameter param in parameters)
{
XmlSerializer serializer = new XmlSerializer(param.Value.GetType());
@ -121,11 +137,11 @@ namespace WebsitePanel.EnterpriseServer
return parameters;
}
private static IList<BackgroundTaskParameter> DeserializeParams(IList<BackgroundTaskParameter> parameters)
private static List<BackgroundTaskParameter> DeserializeParams(List<BackgroundTaskParameter> parameters)
{
foreach (BackgroundTaskParameter param in parameters)
{
XmlSerializer deserializer = new XmlSerializer(param.Value.GetType());
XmlSerializer deserializer = new XmlSerializer(param.SerializerValue.GetType());
StringReader sr = new StringReader(param.SerializerValue);
param.Value = deserializer.Deserialize(sr);

View file

@ -37,6 +37,8 @@ using System.Web.Caching;
using System.Xml;
using System.Reflection;
using WebsitePanel.Providers.Common;
using System.Diagnostics;
using System.Linq;
namespace WebsitePanel.EnterpriseServer
{
@ -66,7 +68,7 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, null, itemId, parameter);
}
public static void StartTask(string source, string taskName, int itemId, IList<BackgroundTaskParameter> parameters)
public static void StartTask(string source, string taskName, int itemId, List<BackgroundTaskParameter> parameters)
{
StartTask(source, taskName, null, itemId, parameters);
}
@ -86,7 +88,7 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, itemName, 0, parameter);
}
public static void StartTask(string source, string taskName, object itemName, IList<BackgroundTaskParameter> parameters)
public static void StartTask(string source, string taskName, object itemName, List<BackgroundTaskParameter> parameters)
{
StartTask(source, taskName, itemName, 0, parameters);
}
@ -96,14 +98,14 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, itemName, itemId, 0, parameter);
}
public static void StartTask(string source, string taskName, object itemName, int itemId, IList<BackgroundTaskParameter> parameters)
public static void StartTask(string source, string taskName, object itemName, int itemId, List<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>();
List<BackgroundTaskParameter> parameters = new List<BackgroundTaskParameter>();
if (parameter != null)
{
parameters.Add(parameter);
@ -123,13 +125,13 @@ namespace WebsitePanel.EnterpriseServer
}
public static void StartTask(string source, string taskName, object itemName, int itemId,
int scheduleId, int packageId, int maximumExecutionTime, IList<BackgroundTaskParameter> parameters)
int scheduleId, int packageId, int maximumExecutionTime, List<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)
int scheduleId, int packageId, int maximumExecutionTime, List<BackgroundTaskParameter> parameters)
{
if (String.IsNullOrEmpty(taskId))
{
@ -507,13 +509,43 @@ namespace WebsitePanel.EnterpriseServer
BackgroundTask task = GetTask(taskId);
if (task == null)
{
return;
}
task.Status = BackgroundTaskStatus.Abort;
StopProcess(task.TaskId);
TaskController.UpdateTask(task);
}
public static void StopTask(BackgroundTask task)
{
if (task == null)
{
return;
}
task.Status = BackgroundTaskStatus.Abort;
StopProcess(task.TaskId);
TaskController.UpdateTask(task);
}
private static void StopProcess(string taskId)
{
var process = Process.GetProcesses().FirstOrDefault(
p => p.ProcessName.Equals(taskId, StringComparison.CurrentCultureIgnoreCase));
if (process != null)
{
process.Kill();
process.WaitForExit(10000);
}
}
public static List<BackgroundTask> GetUserTasks(int userId)
{
List<BackgroundTask> list = new List<BackgroundTask>();
@ -717,7 +749,7 @@ namespace WebsitePanel.EnterpriseServer
return res;
}
public static T StartResultTask<T>(string source, string taskName, int itemId, IList<BackgroundTaskParameter> parameters) where T : ResultObject, new()
public static T StartResultTask<T>(string source, string taskName, int itemId, List<BackgroundTaskParameter> parameters) where T : ResultObject, new()
{
StartTask(source, taskName, itemId, parameters);
T res = new T();