Fixes Schedulers bugs
This commit is contained in:
parent
e8ed10a67b
commit
c8a8be8894
7 changed files with 65 additions and 43 deletions
|
@ -110,7 +110,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
var taskThread = new Thread(() => RunBackgroundTask(task)) { Priority = ThreadPriority.Highest };
|
||||
taskThread.Start();
|
||||
TaskManager.AddTaskThread(task, taskThread);
|
||||
TaskManager.AddTaskThread(task.Id, taskThread);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,6 +132,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
|
||||
|
||||
objTask.DoWork();
|
||||
// Thread.Sleep(40000);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
@ -160,24 +160,39 @@ namespace WebsitePanel.EnterpriseServer
|
|||
if (schedule == null)
|
||||
return 0;
|
||||
|
||||
if (TaskController.GetScheduleTasks(scheduleId).Any(x => x.Status == BackgroundTaskStatus.Run
|
||||
|| x.Status == BackgroundTaskStatus.Starting))
|
||||
return 0;
|
||||
|
||||
var parameters = schedule.ScheduleInfo.Parameters.Select(
|
||||
prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList();
|
||||
|
||||
var packageInfo = PackageController.GetPackage(schedule.ScheduleInfo.PackageId);
|
||||
var backgroundTask = new BackgroundTask(
|
||||
Guid.NewGuid(),
|
||||
Guid.NewGuid().ToString("N"),
|
||||
SecurityContext.User.UserId,
|
||||
SecurityContext.User.IsPeer
|
||||
? SecurityContext.User.OwnerId
|
||||
: SecurityContext.User.UserId, "SCHEDULER", "RUN_SCHEDULE",
|
||||
: packageInfo.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);
|
||||
|
||||
// update next run (if required)
|
||||
CalculateNextStartTime(schedule.ScheduleInfo);
|
||||
|
||||
// disable run once task
|
||||
if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime)
|
||||
schedule.ScheduleInfo.Enabled = false;
|
||||
|
||||
schedule.ScheduleInfo.LastRun = DateTime.Now;
|
||||
UpdateSchedule(schedule.ScheduleInfo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -109,6 +109,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
else
|
||||
throw new Exception(String.Format("Could not create scheduled task of '{0}' type",
|
||||
task.TaskType));
|
||||
// Thread.Sleep(40000);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
@ -69,7 +69,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return task;
|
||||
}
|
||||
|
||||
public static void AddTask(BackgroundTask task)
|
||||
public static int AddTask(BackgroundTask task)
|
||||
{
|
||||
int taskId = DataProvider.AddBackgroundTask(task.Guid, task.TaskId, task.ScheduleId, task.PackageId, task.UserId,
|
||||
task.EffectiveUserId, task.TaskName, task.ItemId, task.ItemName,
|
||||
|
@ -80,6 +80,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
AddTaskParams(taskId, task.Params);
|
||||
|
||||
DataProvider.AddBackgroundTaskStack(taskId);
|
||||
return taskId;
|
||||
}
|
||||
|
||||
public static void UpdateTask(BackgroundTask task)
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Collections;
|
||||
|
@ -46,7 +47,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
private static Hashtable eventHandlers = null;
|
||||
//using id instead of guid
|
||||
private static Dictionary<int, Thread> _taskThreadsDictionary = new Dictionary<int, Thread>();
|
||||
private static ConcurrentDictionary<int, Thread> _taskThreadsDictionary = new ConcurrentDictionary<int, Thread>();
|
||||
|
||||
// purge timer, used for killing old tasks from the hash
|
||||
static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks),
|
||||
|
@ -162,11 +163,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
String itemNameStr = itemName != null
|
||||
? itemName.ToString()
|
||||
: String.Empty;
|
||||
|
||||
BackgroundTask task = new BackgroundTask(Guid, taskId, userId, effectiveUserId, source, taskName, itemNameStr,
|
||||
itemId, scheduleId, packageId, maximumExecutionTime, parameters);
|
||||
|
||||
AddTaskThread(task, Thread.CurrentThread);
|
||||
|
||||
List<BackgroundTask> tasks = TaskController.GetTasks(Guid);
|
||||
|
||||
|
@ -188,7 +187,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
// call event handler
|
||||
CallTaskEventHandler(task, false);
|
||||
|
||||
TaskController.AddTask(task);
|
||||
int newTaskId = TaskController.AddTask(task);
|
||||
AddTaskThread(newTaskId, Thread.CurrentThread);
|
||||
}
|
||||
|
||||
public static void WriteParameter(string parameterName, object parameterValue)
|
||||
|
@ -551,12 +551,12 @@ namespace WebsitePanel.EnterpriseServer
|
|||
task.NotifyOnComplete = true;
|
||||
}
|
||||
|
||||
internal static void AddTaskThread(BackgroundTask task, Thread taskThread)
|
||||
internal static void AddTaskThread(int taskId, Thread taskThread)
|
||||
{
|
||||
if (_taskThreadsDictionary.ContainsKey(task.Id))
|
||||
_taskThreadsDictionary[task.Id] = taskThread;
|
||||
if (_taskThreadsDictionary.ContainsKey(taskId))
|
||||
_taskThreadsDictionary[taskId] = taskThread;
|
||||
else
|
||||
_taskThreadsDictionary.Add(task.Id, taskThread);
|
||||
_taskThreadsDictionary.AddOrUpdate(taskId, taskThread, (key, oldValue) => taskThread);
|
||||
}
|
||||
|
||||
public static void StopTask(string taskId)
|
||||
|
@ -579,8 +579,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
if (_taskThreadsDictionary.ContainsKey(key))
|
||||
{
|
||||
_taskThreadsDictionary[key].Abort();
|
||||
_taskThreadsDictionary.Remove(key);
|
||||
if (_taskThreadsDictionary[key] != null)
|
||||
if (_taskThreadsDictionary[key].IsAlive)
|
||||
_taskThreadsDictionary[key].Abort();
|
||||
Thread deleted;
|
||||
_taskThreadsDictionary.TryRemove(key,out deleted);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue