Fixing bugs (Scheduler)
This commit is contained in:
parent
bcceb95f92
commit
e8ed10a67b
7 changed files with 36 additions and 39 deletions
|
@ -1075,7 +1075,7 @@ SELECT
|
||||||
FROM BackgroundTasks AS T
|
FROM BackgroundTasks AS T
|
||||||
INNER JOIN BackgroundTaskStack AS TS
|
INNER JOIN BackgroundTaskStack AS TS
|
||||||
ON TS.TaskId = T.ID
|
ON TS.TaskId = T.ID
|
||||||
WHERE T.EffectiveUserID = @ActorID AND T.Guid = @Guid
|
WHERE T.Guid = @Guid
|
||||||
GO
|
GO
|
||||||
|
|
||||||
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTopTask')
|
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetBackgroundTopTask')
|
||||||
|
@ -1113,7 +1113,7 @@ SELECT TOP 1
|
||||||
FROM BackgroundTasks AS T
|
FROM BackgroundTasks AS T
|
||||||
INNER JOIN BackgroundTaskStack AS TS
|
INNER JOIN BackgroundTaskStack AS TS
|
||||||
ON TS.TaskId = T.ID
|
ON TS.TaskId = T.ID
|
||||||
WHERE T.EffectiveUserID = @ActorID AND T.Guid = @Guid
|
WHERE T.Guid = @Guid
|
||||||
ORDER BY T.StartDate DESC
|
ORDER BY T.StartDate DESC
|
||||||
GO
|
GO
|
||||||
|
|
||||||
|
@ -1372,6 +1372,7 @@ AS
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
T.ID,
|
T.ID,
|
||||||
|
T.Guid,
|
||||||
T.TaskID,
|
T.TaskID,
|
||||||
T.ScheduleId,
|
T.ScheduleId,
|
||||||
T.PackageId,
|
T.PackageId,
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
DataProvider.AddAuditLogRecord(recordId, severityId, userId, username, packageId, itemId, itemName,
|
DataProvider.AddAuditLogRecord(recordId, severityId, userId, username, packageId, itemId, itemName,
|
||||||
startDate, finishDate, sourceName, taskName, executionLog);
|
startDate, finishDate, sourceName, taskName, executionLog);
|
||||||
}
|
}
|
||||||
catch
|
catch(Exception ex)
|
||||||
{
|
{
|
||||||
// skip error
|
// skip error
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,18 +97,20 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
private static void RunManualTasks()
|
private static void RunManualTasks()
|
||||||
{
|
{
|
||||||
var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting);
|
var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping);
|
||||||
|
|
||||||
foreach (var task in tasks)
|
foreach (var task in tasks)
|
||||||
{
|
{
|
||||||
new Thread(() => RunBackgroundTask(task)) {Priority = ThreadPriority.Highest}.Start();
|
TaskManager.StopTask(task.TaskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping);
|
tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting);
|
||||||
|
|
||||||
foreach (var task in tasks)
|
foreach (var task in tasks)
|
||||||
{
|
{
|
||||||
TaskManager.StopTask(task);
|
var taskThread = new Thread(() => RunBackgroundTask(task)) { Priority = ThreadPriority.Highest };
|
||||||
|
taskThread.Start();
|
||||||
|
TaskManager.AddTaskThread(task, taskThread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,8 +132,6 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
|
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
|
||||||
|
|
||||||
objTask.DoWork();
|
objTask.DoWork();
|
||||||
|
|
||||||
Thread.Sleep(100000);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
var backgroundTask = new BackgroundTask(
|
var backgroundTask = new BackgroundTask(
|
||||||
Guid.NewGuid(),
|
Guid.NewGuid(),
|
||||||
schedule.ScheduleInfo.TaskId,
|
Guid.NewGuid().ToString("N"),
|
||||||
SecurityContext.User.UserId,
|
SecurityContext.User.UserId,
|
||||||
SecurityContext.User.IsPeer
|
SecurityContext.User.IsPeer
|
||||||
? SecurityContext.User.OwnerId
|
? SecurityContext.User.OwnerId
|
||||||
|
|
|
@ -66,7 +66,6 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
{
|
{
|
||||||
// create worker
|
// create worker
|
||||||
Thread worker = new Thread(new ThreadStart(RunSchedule));
|
Thread worker = new Thread(new ThreadStart(RunSchedule));
|
||||||
|
|
||||||
// set worker priority
|
// set worker priority
|
||||||
switch (scheduleInfo.Priority)
|
switch (scheduleInfo.Priority)
|
||||||
{
|
{
|
||||||
|
@ -109,7 +108,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
objTask.DoWork();
|
objTask.DoWork();
|
||||||
else
|
else
|
||||||
throw new Exception(String.Format("Could not create scheduled task of '{0}' type",
|
throw new Exception(String.Format("Could not create scheduled task of '{0}' type",
|
||||||
task.TaskType));
|
task.TaskType));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
AddTaskParams(task.Id, task.Params);
|
AddTaskParams(task.Id, task.Params);
|
||||||
|
|
||||||
if (task.Completed || task.Status == BackgroundTaskStatus.Abort || task.Status == BackgroundTaskStatus.Stopping)
|
if (task.Completed || task.Status == BackgroundTaskStatus.Abort)
|
||||||
{
|
{
|
||||||
DeleteTaskStack(task.Id);
|
DeleteTaskStack(task.Id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,8 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
public class TaskManager
|
public class TaskManager
|
||||||
{
|
{
|
||||||
private static Hashtable eventHandlers = null;
|
private static Hashtable eventHandlers = null;
|
||||||
|
//using id instead of guid
|
||||||
|
private static Dictionary<int, Thread> _taskThreadsDictionary = new Dictionary<int, Thread>();
|
||||||
|
|
||||||
// purge timer, used for killing old tasks from the hash
|
// purge timer, used for killing old tasks from the hash
|
||||||
static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks),
|
static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks),
|
||||||
|
@ -164,6 +166,8 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
BackgroundTask task = new BackgroundTask(Guid, taskId, userId, effectiveUserId, source, taskName, itemNameStr,
|
BackgroundTask task = new BackgroundTask(Guid, taskId, userId, effectiveUserId, source, taskName, itemNameStr,
|
||||||
itemId, scheduleId, packageId, maximumExecutionTime, parameters);
|
itemId, scheduleId, packageId, maximumExecutionTime, parameters);
|
||||||
|
|
||||||
|
AddTaskThread(task, Thread.CurrentThread);
|
||||||
|
|
||||||
List<BackgroundTask> tasks = TaskController.GetTasks(Guid);
|
List<BackgroundTask> tasks = TaskController.GetTasks(Guid);
|
||||||
|
|
||||||
if (tasks.Count > 0)
|
if (tasks.Count > 0)
|
||||||
|
@ -289,7 +293,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
topTask.Logs = TaskController.GetLogs(topTask.Id, topTask.StartDate);
|
topTask.Logs = TaskController.GetLogs(topTask.Id, topTask.StartDate);
|
||||||
|
|
||||||
string executionLog = FormatExecutionLog(topTask);
|
string executionLog = FormatExecutionLog(topTask);
|
||||||
UserInfo user = UserController.GetUserInternally(topTask.UserId);
|
UserInfo user = UserController.GetUserInternally(topTask.EffectiveUserId);
|
||||||
string username = user != null ? user.Username : null;
|
string username = user != null ? user.Username : null;
|
||||||
|
|
||||||
AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.EffectiveUserId,
|
AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.EffectiveUserId,
|
||||||
|
@ -419,7 +423,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
if (task.MaximumExecutionTime != -1
|
if (task.MaximumExecutionTime != -1
|
||||||
&& ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime)
|
&& ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime)
|
||||||
{
|
{
|
||||||
task.Status = BackgroundTaskStatus.Abort;
|
task.Status = BackgroundTaskStatus.Stopping;
|
||||||
|
|
||||||
TaskController.UpdateTask(task);
|
TaskController.UpdateTask(task);
|
||||||
}
|
}
|
||||||
|
@ -526,6 +530,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
{
|
{
|
||||||
if (task.ScheduleId > 0
|
if (task.ScheduleId > 0
|
||||||
&& !task.Completed
|
&& !task.Completed
|
||||||
|
&& (task.Status == BackgroundTaskStatus.Run || task.Status == BackgroundTaskStatus.Starting)
|
||||||
&& !scheduledTasks.ContainsKey(task.ScheduleId))
|
&& !scheduledTasks.ContainsKey(task.ScheduleId))
|
||||||
scheduledTasks.Add(task.ScheduleId, task);
|
scheduledTasks.Add(task.ScheduleId, task);
|
||||||
}
|
}
|
||||||
|
@ -546,6 +551,14 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
task.NotifyOnComplete = true;
|
task.NotifyOnComplete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void AddTaskThread(BackgroundTask task, Thread taskThread)
|
||||||
|
{
|
||||||
|
if (_taskThreadsDictionary.ContainsKey(task.Id))
|
||||||
|
_taskThreadsDictionary[task.Id] = taskThread;
|
||||||
|
else
|
||||||
|
_taskThreadsDictionary.Add(task.Id, taskThread);
|
||||||
|
}
|
||||||
|
|
||||||
public static void StopTask(string taskId)
|
public static void StopTask(string taskId)
|
||||||
{
|
{
|
||||||
BackgroundTask task = GetTask(taskId);
|
BackgroundTask task = GetTask(taskId);
|
||||||
|
@ -557,35 +570,18 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
|
|
||||||
task.Status = BackgroundTaskStatus.Abort;
|
task.Status = BackgroundTaskStatus.Abort;
|
||||||
|
|
||||||
StopProcess(task.TaskId);
|
StopProcess(task.Id);
|
||||||
|
|
||||||
TaskController.UpdateTask(task);
|
TaskController.UpdateTask(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StopTask(BackgroundTask task)
|
private static void StopProcess(int key)
|
||||||
{
|
{
|
||||||
if (task == null)
|
if (_taskThreadsDictionary.ContainsKey(key))
|
||||||
{
|
{
|
||||||
return;
|
_taskThreadsDictionary[key].Abort();
|
||||||
}
|
_taskThreadsDictionary.Remove(key);
|
||||||
|
}
|
||||||
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)
|
public static List<BackgroundTask> GetUserTasks(int userId)
|
||||||
|
@ -827,6 +823,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue