Schedulers fixed

This commit is contained in:
vfedosevich 2013-06-03 14:07:52 +03:00
parent c8a8be8894
commit 645229bef1
17 changed files with 278 additions and 85 deletions

View file

@ -212,7 +212,7 @@ namespace WebsitePanel.EnterpriseServer
// try implicit type conversion
props[i].SetValue(obj, propVal, null);
}
catch
catch (Exception ex)
{
// convert to string and then set property value
try
@ -220,14 +220,14 @@ namespace WebsitePanel.EnterpriseServer
string strVal = propVal.ToString();
props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
}
catch
catch(Exception e)
{
// skip property init
}
}
}
}
catch{} // just skip
catch (Exception e) { } // just skip
} // for properties
}
}

View file

@ -1999,11 +1999,18 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@taskId", taskId));
}
public static void DeleteBackgroundTaskStack(int taskId)
public static void DeleteBackgroundTasks(Guid guid)
{
SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "DeleteBackgroundTaskStack",
new SqlParameter("@taskId", taskId));
ObjectQualifier + "DeleteBackgroundTasks",
new SqlParameter("@guid", guid));
}
public static void DeleteBackgroundTask(int taskId)
{
SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "DeleteBackgroundTask",
new SqlParameter("@id", taskId));
}
public static IDataReader GetScheduleTasks(int actorId)

View file

@ -622,7 +622,7 @@ namespace WebsitePanel.EnterpriseServer
topTask.ItemId = userId;
topTask.UpdateParamValue("SendLetter", sendLetter);
TaskController.UpdateTask(topTask);
TaskController.UpdateTaskWithParams(topTask);
return result;
}
@ -729,7 +729,7 @@ namespace WebsitePanel.EnterpriseServer
topTask.UpdateParamValue("UserId", userId);
topTask.UpdateParamValue("SendLetter", sendLetter);
TaskController.UpdateTask(topTask);
TaskController.UpdateTaskWithParams(topTask);
}
finally
{

View file

@ -31,6 +31,7 @@ using System.IO;
using System.Data;
using System.Text;
using System.Collections.Generic;
using System.Threading;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
@ -118,7 +119,7 @@ namespace WebsitePanel.EnterpriseServer
{
TaskManager.StartTask(taskId, "BACKUP", "BACKUP", backupFileName, SecurityContext.User.UserId);
// get the list of items to backup
// get the list of items to backup
TaskManager.Write("Calculate items to backup");
List<ServiceProviderItem> items = GetBackupItems(userId, packageId, serviceId, serverId);
@ -209,7 +210,7 @@ namespace WebsitePanel.EnterpriseServer
// increment progress
TaskManager.IndicatorCurrent += 1;
}
}
}
}
catch (Exception ex)
@ -805,7 +806,7 @@ namespace WebsitePanel.EnterpriseServer
//
return true;
}
catch
catch(Exception e)
{
//
return false;

View file

@ -29,6 +29,7 @@
using System;
using System.Data;
using System.Configuration;
using System.Threading;
using System.Web;
using System.Web.Security;
using System.Web.UI;
@ -48,6 +49,7 @@ namespace WebsitePanel.EnterpriseServer
/// </summary>
public override void DoWork()
{
string backupFileName;
int storePackageId;
string storePackageFolder;

View file

@ -43,7 +43,7 @@ namespace WebsitePanel.EnterpriseServer
public sealed class Scheduler
{
public static SchedulerJob nextSchedule = null;
private static Timer timer = new Timer(ScheduleTasks, null, 30000, 30000);
//private static Timer timer = new Timer(ScheduleTasks, null, 30000, 30000);
public static void Start()
{
@ -132,7 +132,7 @@ namespace WebsitePanel.EnterpriseServer
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
objTask.DoWork();
// Thread.Sleep(40000);
// Thread.Sleep(40000);
}
catch (Exception ex)
{

View file

@ -167,19 +167,23 @@ namespace WebsitePanel.EnterpriseServer
var parameters = schedule.ScheduleInfo.Parameters.Select(
prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList();
var packageInfo = PackageController.GetPackage(schedule.ScheduleInfo.PackageId);
var userInfo = PackageController.GetPackageOwner(schedule.ScheduleInfo.PackageId);
var backgroundTask = new BackgroundTask(
Guid.NewGuid(),
Guid.NewGuid().ToString("N"),
SecurityContext.User.UserId,
SecurityContext.User.IsPeer
? SecurityContext.User.OwnerId
: packageInfo.UserId, "SCHEDULER", "RUN_SCHEDULE",
userInfo.OwnerId == 0 ? userInfo.UserId : userInfo.OwnerId,
userInfo.UserId,
"SCHEDULER",
"RUN_SCHEDULE",
schedule.ScheduleInfo.ScheduleName,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.ScheduleId,
schedule.ScheduleInfo.PackageId,
schedule.ScheduleInfo.MaxExecutionTime, parameters) { Status = BackgroundTaskStatus.Starting };
schedule.ScheduleInfo.MaxExecutionTime, parameters)
{
Status = BackgroundTaskStatus.Starting
};
TaskController.AddTask(backgroundTask);

View file

@ -109,7 +109,7 @@ namespace WebsitePanel.EnterpriseServer
else
throw new Exception(String.Format("Could not create scheduled task of '{0}' type",
task.TaskType));
// Thread.Sleep(40000);
// Thread.Sleep(40000);
}
catch (Exception ex)
{

View file

@ -80,27 +80,57 @@ namespace WebsitePanel.EnterpriseServer
AddTaskParams(taskId, task.Params);
DataProvider.AddBackgroundTaskStack(taskId);
return taskId;
}
public static void UpdateTask(BackgroundTask task)
public static void UpdateTaskWithParams(BackgroundTask task)
{
if (UpdateTask(task))
{
UpdateBackgroundTaskParams(task);
}
}
public static bool UpdateTask(BackgroundTask task)
{
if (task.Status == BackgroundTaskStatus.Abort)
{
DeleteBackgroundTasks(task.Guid);
return false;
}
if (task.Completed)
{
DeleteBackgroundTask(task.Id);
return false;
}
DataProvider.UpdateBackgroundTask(task.Guid, 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 || task.Status == BackgroundTaskStatus.Abort)
{
DeleteTaskStack(task.Id);
}
return true;
}
public static void DeleteTaskStack(int taskId)
public static void UpdateBackgroundTaskParams(BackgroundTask task)
{
DataProvider.DeleteBackgroundTaskStack(taskId);
DataProvider.DeleteBackgroundTaskParams(task.Id);
AddTaskParams(task.Id, task.Params);
}
public static void DeleteBackgroundTasks(Guid guid)
{
DataProvider.DeleteBackgroundTasks(guid);
}
public static void DeleteBackgroundTask(int id)
{
DataProvider.DeleteBackgroundTask(id);
}
public static void AddTaskParams(int taskId, List<BackgroundTaskParameter> parameters)

View file

@ -155,10 +155,13 @@ namespace WebsitePanel.EnterpriseServer
taskId = Guid.NewGuid().ToString("N");
}
int userId = SecurityContext.User.OwnerId;
int effectiveUserId = SecurityContext.User.IsPeer
? userId
: SecurityContext.User.UserId;
var user = SecurityContext.User;
int userId = user.OwnerId == 0
? user.UserId
: user.OwnerId;
int effectiveUserId = user.UserId;
String itemNameStr = itemName != null
? itemName.ToString()
@ -286,23 +289,12 @@ namespace WebsitePanel.EnterpriseServer
// write task execution result to database
if (tasks.Count == 1) // single task
{
// unregister task globally
// tasks.Remove(TopTask.TaskId);
// write to database
topTask.Logs = TaskController.GetLogs(topTask.Id, topTask.StartDate);
string executionLog = FormatExecutionLog(topTask);
UserInfo user = UserController.GetUserInternally(topTask.EffectiveUserId);
string username = user != null ? user.Username : null;
AuditLog.AddAuditLogRecord(topTask.TaskId, topTask.Severity, topTask.EffectiveUserId,
username, topTask.PackageId, topTask.ItemId,
topTask.ItemName, topTask.StartDate, topTask.FinishDate, topTask.Source,
topTask.TaskName, executionLog);
AddAuditLog(topTask);
}
TaskController.UpdateTask(topTask);
StopProcess(topTask);
}
public static void UpdateParam(String name, Object value)
@ -314,7 +306,7 @@ namespace WebsitePanel.EnterpriseServer
topTask.UpdateParamValue(name, value);
TaskController.UpdateTask(topTask);
TaskController.UpdateTaskWithParams(topTask);
}
public static int ItemId
@ -359,7 +351,7 @@ namespace WebsitePanel.EnterpriseServer
topTask.UpdateParamValue(key, parameters[key]);
}
TaskController.UpdateTask(topTask);
TaskController.UpdateTaskWithParams(topTask);
}
static string FormatExecutionLog(BackgroundTask task)
@ -535,7 +527,7 @@ namespace WebsitePanel.EnterpriseServer
scheduledTasks.Add(task.ScheduleId, task);
}
}
catch (Exception)
catch (Exception e)
{
}
return scheduledTasks;
@ -570,23 +562,51 @@ namespace WebsitePanel.EnterpriseServer
task.Status = BackgroundTaskStatus.Abort;
StopProcess(task.Id);
StopProcess(task);
if (!HasErrors(task))
{
task.Severity = 1;
}
task.FinishDate = DateTime.Now;
AddAuditLog(task);
TaskController.UpdateTask(task);
}
private static void StopProcess(int key)
private static void StopProcess(BackgroundTask task)
{
if (_taskThreadsDictionary.ContainsKey(key))
if (_taskThreadsDictionary.ContainsKey(task.Id))
{
if (_taskThreadsDictionary[key] != null)
if (_taskThreadsDictionary[key].IsAlive)
_taskThreadsDictionary[key].Abort();
if (_taskThreadsDictionary[task.Id] != null)
if (_taskThreadsDictionary[task.Id].IsAlive)
{
if (!task.Completed)
_taskThreadsDictionary[task.Id].Abort();
_taskThreadsDictionary[task.Id] = null;
}
Thread deleted;
_taskThreadsDictionary.TryRemove(key,out deleted);
_taskThreadsDictionary.TryRemove(task.Id, out deleted);
}
}
private static void AddAuditLog(BackgroundTask task)
{
task.Logs = TaskController.GetLogs(task.Id, task.StartDate);
string executionLog = FormatExecutionLog(task);
UserInfo user = UserController.GetUserInternally(task.EffectiveUserId);
string username = user != null ? user.Username : null;
AuditLog.AddAuditLogRecord(task.TaskId, task.Severity, task.EffectiveUserId,
username, task.PackageId, task.ItemId,
task.ItemName, task.StartDate, task.FinishDate, task.Source,
task.TaskName, executionLog);
}
public static List<BackgroundTask> GetUserTasks(int userId)
{
List<BackgroundTask> list = new List<BackgroundTask>();
@ -597,7 +617,7 @@ namespace WebsitePanel.EnterpriseServer
return list; // prohibited user
// get user tasks
foreach (BackgroundTask task in TaskController.GetTasks())
foreach (BackgroundTask task in TaskController.GetTasks(user.IsPeer ? user.OwnerId : user.UserId))
{
if (task.UserId == userId && !task.Completed
&& task.Status == BackgroundTaskStatus.Run)

View file

@ -453,7 +453,7 @@ namespace WebsitePanel.EnterpriseServer
topTask.ItemId = userId;
topTask.UpdateParamValue("SendLetter", sendLetter);
TaskController.UpdateTask(topTask);
TaskController.UpdateTaskWithParams(topTask);
return userId;
}