Scheduler fixes
This commit is contained in:
parent
932e77c770
commit
6bd68d4279
3 changed files with 65 additions and 41 deletions
|
@ -40,9 +40,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
public sealed class Scheduler
|
||||
{
|
||||
static SchedulerJob nextSchedule = null;
|
||||
public static SchedulerJob nextSchedule = null;
|
||||
|
||||
// main timer
|
||||
// main timer and put it to sleep
|
||||
static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule),
|
||||
null,
|
||||
Timeout.Infinite,
|
||||
|
@ -92,6 +92,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
// this will put the timer to sleep
|
||||
scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
|
||||
// run immediately
|
||||
RunNextSchedule(null);
|
||||
}
|
||||
|
@ -122,31 +124,47 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
static void RunSchedule(SchedulerJob schedule, bool changeNextRun)
|
||||
{
|
||||
// update next run (if required)
|
||||
if (changeNextRun)
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo);
|
||||
// update next run (if required)
|
||||
if (changeNextRun)
|
||||
{
|
||||
SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo);
|
||||
}
|
||||
|
||||
// disable run once task
|
||||
if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime)
|
||||
schedule.ScheduleInfo.Enabled = false;
|
||||
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
// this task should be run, so
|
||||
// update its last run
|
||||
schedule.ScheduleInfo.LastRun = DateTime.Now;
|
||||
|
||||
// update schedule
|
||||
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
|
||||
|
||||
// skip execution if the current task is still running
|
||||
scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
{
|
||||
// run the schedule in the separate thread
|
||||
schedule.Run();
|
||||
}
|
||||
}
|
||||
catch (Exception Ex)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.WriteError(string.Format("RunSchedule Error : {0}", Ex.Message));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
// disable run once task
|
||||
if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime)
|
||||
schedule.ScheduleInfo.Enabled = false;
|
||||
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
// this task should be run, so
|
||||
// update its last run
|
||||
schedule.ScheduleInfo.LastRun = DateTime.Now;
|
||||
|
||||
// update schedule
|
||||
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
|
||||
|
||||
// skip execution if the current task is still running
|
||||
if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
return;
|
||||
|
||||
// run the schedule in the separate thread
|
||||
schedule.Run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,21 +86,21 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId);
|
||||
ScheduleInfo si = ObjectUtils.FillObjectFromDataView<ScheduleInfo>(ds.Tables[0].DefaultView);
|
||||
return si;
|
||||
return si;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets view configuration for a certain task.
|
||||
/// </summary>
|
||||
/// <param name="taskId">Task id for which view configuration is intended to be loeaded.</param>
|
||||
/// <returns>View configuration for the task with supplied id.</returns>
|
||||
public static List<ScheduleTaskViewConfiguration> GetScheduleTaskViewConfigurations(string taskId)
|
||||
{
|
||||
List<ScheduleTaskViewConfiguration> c = ObjectUtils.CreateListFromDataReader<ScheduleTaskViewConfiguration>(DataProvider.GetScheduleTaskViewConfigurations(taskId));
|
||||
return c;
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets view configuration for a certain task.
|
||||
/// </summary>
|
||||
/// <param name="taskId">Task id for which view configuration is intended to be loeaded.</param>
|
||||
/// <returns>View configuration for the task with supplied id.</returns>
|
||||
public static List<ScheduleTaskViewConfiguration> GetScheduleTaskViewConfigurations(string taskId)
|
||||
{
|
||||
List<ScheduleTaskViewConfiguration> c = ObjectUtils.CreateListFromDataReader<ScheduleTaskViewConfiguration>(DataProvider.GetScheduleTaskViewConfigurations(taskId));
|
||||
return c;
|
||||
}
|
||||
|
||||
internal static SchedulerJob GetScheduleComplete(int scheduleId)
|
||||
internal static SchedulerJob GetScheduleComplete(int scheduleId)
|
||||
{
|
||||
DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId);
|
||||
return CreateCompleteScheduleFromDataSet(ds);
|
||||
|
@ -199,7 +199,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
nextStart = lastRun.AddSeconds(schedule.Interval);
|
||||
}
|
||||
|
||||
if(nextStart < now)
|
||||
if (nextStart < now)
|
||||
nextStart = now; // run immediately
|
||||
|
||||
// check if start time is in allowed interval
|
||||
|
@ -261,7 +261,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check quota
|
||||
if(PackageController.GetPackageQuota(schedule.PackageId, Quotas.OS_SCHEDULEDTASKS).QuotaExhausted)
|
||||
if (PackageController.GetPackageQuota(schedule.PackageId, Quotas.OS_SCHEDULEDTASKS).QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_OS_SCHEDULED_TASK_QUOTA_LIMIT;
|
||||
|
||||
CalculateNextStartTime(schedule);
|
||||
|
|
|
@ -94,7 +94,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
TaskManager.ItemId = scheduleInfo.ScheduleId;
|
||||
TaskManager.ScheduleId = scheduleInfo.ScheduleId;
|
||||
TaskManager.MaximumExecutionTime = scheduleInfo.MaxExecutionTime;
|
||||
|
||||
|
||||
// set task parameters
|
||||
foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters)
|
||||
TaskManager.TaskParameters[prm.ParameterId] = prm.ParameterValue;
|
||||
|
@ -119,7 +119,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
try
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue