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

@ -880,9 +880,7 @@ CREATE TABLE BackgroundTasks
Severity INT NOT NULL, Severity INT NOT NULL,
Completed BIT, Completed BIT,
NotifyOnComplete BIT, NotifyOnComplete BIT,
Status INT NOT NULL, Status INT NOT NULL
FOREIGN KEY (ScheduleID) REFERENCES Schedule (ScheduleID),
FOREIGN KEY (PackageID) REFERENCES Packages (PackageID)
) )
GO GO
@ -913,9 +911,8 @@ GO
CREATE TABLE BackgroundTaskStack CREATE TABLE BackgroundTaskStack
( (
TaskStackID INT NOT NULL PRIMARY KEY, TaskStackID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
TaskID INT NOT NULL, TaskID INT NOT NULL,
Value NVARCHAR(MAX),
FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID) FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID)
) )
GO GO
@ -1150,8 +1147,6 @@ CREATE PROCEDURE [dbo].[UpdateBackgroundTask]
@TaskID INT, @TaskID INT,
@ScheduleID INT, @ScheduleID INT,
@PackageID INT, @PackageID INT,
@UserID INT,
@EffectiveUserID INT,
@TaskName NVARCHAR(255), @TaskName NVARCHAR(255),
@ItemID INT, @ItemID INT,
@ItemName NVARCHAR(255), @ItemName NVARCHAR(255),
@ -1167,12 +1162,10 @@ CREATE PROCEDURE [dbo].[UpdateBackgroundTask]
) )
AS AS
UPDATE BackgroundTask UPDATE BackgroundTasks
SET SET
ScheduleID = @ScheduleID, ScheduleID = @ScheduleID,
PackageID = @PackageID, PackageID = @PackageID,
UserID = @UserID,
EffectiveUserID = @EffectiveUserID,
TaskName = @TaskName, TaskName = @TaskName,
ItemID = @ItemID, ItemID = @ItemID,
ItemName = @ItemName, ItemName = @ItemName,
@ -1259,4 +1252,35 @@ AS
DELETE FROM BackgroundTaskStack DELETE FROM BackgroundTaskStack
WHERE TaskID = @TaskID WHERE TaskID = @TaskID
GO
CREATE PROCEDURE [dbo].[GetProcessBackgroundTasks]
(
@ActorID INT,
@Status INT
)
AS
SELECT
T.ID,
T.TaskID,
T.ScheduleId,
T.PackageId,
T.UserId,
T.EffectiveUserId,
T.TaskName,
T.ItemId,
T.ItemName,
T.StartDate,
T.FinishDate,
T.IndicatorCurrent,
T.IndicatorMaximum,
T.MaximumExecutionTime,
T.Source,
T.Severity,
T.Completed,
T.NotifyOnComplete,
T.Status
FROM BackgroundTasks AS T
WHERE T.UserID = @ActorID AND T.Completed = 0 AND T.Status = @Status
GO GO

View file

@ -41,25 +41,25 @@ namespace WebsitePanel.EnterpriseServer
{ {
#region Properties #region Properties
public int Id { get; protected set; } public int Id { get; set; }
public String TaskId { get; protected set; } public String TaskId { get; set; }
public int ScheduleId { get; set; } public int ScheduleId { get; set; }
public int PackageId { get; set; } public int PackageId { get; set; }
public int UserId { get; protected set; } public int UserId { get; set; }
public int EffectiveUserId { get; protected set; } public int EffectiveUserId { get; set; }
public String TaskName { get; protected set; } public String TaskName { get; set; }
public int ItemId { get; set; } public int ItemId { get; set; }
public String ItemName { get; set; } public String ItemName { get; set; }
public DateTime StartDate { get; protected set; } public DateTime StartDate { get; set; }
public DateTime FinishDate { get; set; } public DateTime FinishDate { get; set; }
@ -69,7 +69,7 @@ namespace WebsitePanel.EnterpriseServer
public int MaximumExecutionTime { get; set; } public int MaximumExecutionTime { get; set; }
public String Source { get; protected set; } public String Source { get; set; }
public int Severity { get; set; } public int Severity { get; set; }
@ -79,9 +79,9 @@ namespace WebsitePanel.EnterpriseServer
public BackgroundTaskStatus Status { get; set; } public BackgroundTaskStatus Status { get; set; }
public IList<BackgroundTaskLogRecord> Logs { get; set; } public List<BackgroundTaskLogRecord> Logs { get; set; }
public IList<BackgroundTaskParameter> Params { get; set; } public List<BackgroundTaskParameter> Params { get; set; }
#endregion #endregion
@ -99,10 +99,10 @@ namespace WebsitePanel.EnterpriseServer
} }
public BackgroundTask(String taskId, int userId, int effectiveUserId, String source, String taskName, String itemName, public BackgroundTask(String taskId, int userId, int effectiveUserId, String source, String taskName, String itemName,
int itemId, int scheduleId, int packageId, int maximumExecutionTime, IList<BackgroundTaskParameter> parameters) int itemId, int scheduleId, int packageId, int maximumExecutionTime, List<BackgroundTaskParameter> parameters)
: this() : this()
{ {
TaskId = TaskId; TaskId = taskId;
UserId = userId; UserId = userId;
EffectiveUserId = effectiveUserId; EffectiveUserId = effectiveUserId;
Source = source; Source = source;
@ -164,11 +164,11 @@ namespace WebsitePanel.EnterpriseServer
{ {
#region Properties #region Properties
public int ParameterId { get; protected set; } public int ParameterId { get; set; }
public int TaskId { get; protected set; } public int TaskId { get; set; }
public String Name { get; protected set; } public String Name { get; set; }
public Object Value { get; set; } public Object Value { get; set; }

View file

@ -3,6 +3,8 @@
public enum BackgroundTaskStatus public enum BackgroundTaskStatus
{ {
Run = 1, Run = 1,
Abort = 2 Abort = 2,
Starting = 3,
Stopping = 4
} }
} }

View file

@ -1852,6 +1852,14 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("actorId", actorId)); 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) public static IDataReader GetBackgroundTopTask(int actorId)
{ {
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
@ -1910,7 +1918,7 @@ namespace WebsitePanel.EnterpriseServer
public static IDataReader GetBackgroundTaskLogs(int taskId, DateTime startLogTime) public static IDataReader GetBackgroundTaskLogs(int taskId, DateTime startLogTime)
{ {
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "AddBackgroundTaskLogParam", ObjectQualifier + "GetBackgroundTaskLogs",
new SqlParameter("@taskId", taskId), new SqlParameter("@taskId", taskId),
new SqlParameter("@startLogTime", startLogTime)); new SqlParameter("@startLogTime", startLogTime));
} }
@ -1938,7 +1946,7 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@severity", severity), new SqlParameter("@severity", severity),
new SqlParameter("@completed", completed), new SqlParameter("@completed", completed),
new SqlParameter("@notifyOnComplete", notifyOnComplete), 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 // 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 ID", domainId));
parameters.Add(new BackgroundTaskParameter("Domain Type", domainType.ToString())); 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) 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("domainName", domainName));
parameters.Add(new BackgroundTaskParameter("proxyFqdn", proxyFqdn)); parameters.Add(new BackgroundTaskParameter("proxyFqdn", proxyFqdn));

View file

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

View file

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

View file

@ -58,10 +58,8 @@ namespace WebsitePanel.EnterpriseServer
public static bool IsScheduleActive(int scheduleId) public static bool IsScheduleActive(int scheduleId)
{ {
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks(); Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
ScheduleInfo scheduleInfo = SchedulerController.GetSchedule(scheduleId); return scheduledTasks.ContainsKey(scheduleId);
return scheduledTasks.ContainsKey(scheduleId) || scheduleInfo.LastRun > scheduleInfo.LastFinish;
} }
public static void StartSchedule(SchedulerJob schedule) public static void StartSchedule(SchedulerJob schedule)
@ -85,8 +83,10 @@ namespace WebsitePanel.EnterpriseServer
public static void ScheduleTasks() public static void ScheduleTasks()
{ {
nextSchedule = SchedulerController.GetNextSchedule(); RunManualTasks();
nextSchedule = SchedulerController.GetNextSchedule();
// set timer // set timer
if (nextSchedule != null) if (nextSchedule != null)
{ {
@ -94,9 +94,7 @@ namespace WebsitePanel.EnterpriseServer
{ {
// this will put the timer to sleep // this will put the timer to sleep
scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite);
Thread.Sleep(1000);
System.Threading.Thread.Sleep(1000);
// run immediately // run immediately
RunNextSchedule(null); RunNextSchedule(null);
} }
@ -106,13 +104,65 @@ namespace WebsitePanel.EnterpriseServer
TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now); TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now);
if (ts < TimeSpan.Zero) if (ts < TimeSpan.Zero)
ts = TimeSpan.Zero; // cannot be negative ! ts = TimeSpan.Zero; // cannot be negative !
// invoke after the timespan // invoke after the timespan
scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite); 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 // call back for the timer function
static void RunNextSchedule(object obj) // obj ignored static void RunNextSchedule(object obj) // obj ignored
{ {

View file

@ -31,6 +31,7 @@ using System.Data;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Xml; using System.Xml;
using System.Linq;
using WebsitePanel.EnterpriseServer.Base.Scheduling; using WebsitePanel.EnterpriseServer.Base.Scheduling;
namespace WebsitePanel.EnterpriseServer namespace WebsitePanel.EnterpriseServer
@ -157,30 +158,64 @@ namespace WebsitePanel.EnterpriseServer
{ {
// check account // check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
if (accountCheck < 0)
return accountCheck;
SchedulerJob schedule = GetScheduleComplete(scheduleId); SchedulerJob schedule = GetScheduleComplete(scheduleId);
if (schedule == null) if (schedule == null)
return 0; 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; return 0;
} }
public static int StopSchedule(int scheduleId) public static int StopSchedule(int scheduleId)
{ {
// check account
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
if (accountCheck < 0) return accountCheck;
if (accountCheck < 0)
return accountCheck;
SchedulerJob schedule = GetScheduleComplete(scheduleId); SchedulerJob schedule = GetScheduleComplete(scheduleId);
if (schedule == null) if (schedule == null)
return 0; 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; return 0;
} }
public static void CalculateNextStartTime(ScheduleInfo schedule) public static void CalculateNextStartTime(ScheduleInfo schedule)

View file

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

View file

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

View file

@ -37,6 +37,8 @@ using System.Web.Caching;
using System.Xml; using System.Xml;
using System.Reflection; using System.Reflection;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
using System.Diagnostics;
using System.Linq;
namespace WebsitePanel.EnterpriseServer namespace WebsitePanel.EnterpriseServer
{ {
@ -66,7 +68,7 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, null, itemId, parameter); 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); StartTask(source, taskName, null, itemId, parameters);
} }
@ -86,7 +88,7 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, itemName, 0, parameter); 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); StartTask(source, taskName, itemName, 0, parameters);
} }
@ -96,14 +98,14 @@ namespace WebsitePanel.EnterpriseServer
StartTask(source, taskName, itemName, itemId, 0, parameter); 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); 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) 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) if (parameter != null)
{ {
parameters.Add(parameter); parameters.Add(parameter);
@ -123,13 +125,13 @@ namespace WebsitePanel.EnterpriseServer
} }
public static void StartTask(string source, string taskName, object itemName, int itemId, 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>()); 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, 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)) if (String.IsNullOrEmpty(taskId))
{ {
@ -507,13 +509,43 @@ namespace WebsitePanel.EnterpriseServer
BackgroundTask task = GetTask(taskId); BackgroundTask task = GetTask(taskId);
if (task == null) if (task == null)
{
return; return;
}
task.Status = BackgroundTaskStatus.Abort; task.Status = BackgroundTaskStatus.Abort;
StopProcess(task.TaskId);
TaskController.UpdateTask(task); 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) public static List<BackgroundTask> GetUserTasks(int userId)
{ {
List<BackgroundTask> list = new List<BackgroundTask>(); List<BackgroundTask> list = new List<BackgroundTask>();
@ -717,7 +749,7 @@ namespace WebsitePanel.EnterpriseServer
return res; 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); StartTask(source, taskName, itemId, parameters);
T res = new T(); T res = new T();

View file

@ -13,9 +13,8 @@
<asp:TemplateField HeaderText="gvTasksName"> <asp:TemplateField HeaderText="gvTasksName">
<ItemStyle Width="40%"></ItemStyle> <ItemStyle Width="40%"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:hyperlink id="lnkTaskName" runat="server" Visible="false"> <asp:hyperlink id="lnkTaskName" runat="server">
</asp:hyperlink> </asp:hyperlink>
<asp:Literal ID="litTaskName" runat="server" Visible="false"></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:BoundField DataField="ItemName" HeaderText="gvTasksItemName"></asp:BoundField> <asp:BoundField DataField="ItemName" HeaderText="gvTasksItemName"></asp:BoundField>
@ -27,16 +26,15 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField HeaderText="gvTasksProgress"> <asp:TemplateField HeaderText="gvTasksProgress">
<ItemTemplate> <ItemTemplate>
<asp:Panel ID="pnlProgressBarContainer" runat="server" class="ProgressBarContainer" Visible="false"> <div class="ProgressBarContainer">
<asp:Panel id="pnlProgressIndicator" runat="server" CssClass="ProgressBarIndicator"></asp:Panel> <asp:Panel id="pnlProgressIndicator" runat="server" CssClass="ProgressBarIndicator"></asp:Panel>
</asp:Panel> </div>
<asp:Literal ID="litProgressIndicator" runat="server" Visible="false">In Progress</asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField HeaderText="gvTasksActions"> <asp:TemplateField HeaderText="gvTasksActions">
<ItemTemplate> <ItemTemplate>
<asp:LinkButton ID="cmdStop" runat="server" CommandName="stop" <asp:LinkButton ID="cmdStop" runat="server" CommandName="stop"
CausesValidation="false" Text="Stop" OnClientClick="return confirm('Do you really want to terminate this task?');" Visible="false"></asp:LinkButton> CausesValidation="false" Text="Stop" OnClientClick="return confirm('Do you really want to terminate this task?');"></asp:LinkButton>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
</Columns> </Columns>

View file

@ -66,34 +66,13 @@ namespace WebsitePanel.Portal
// find controls // find controls
HyperLink lnkTaskName = (HyperLink)e.Row.FindControl("lnkTaskName"); HyperLink lnkTaskName = (HyperLink)e.Row.FindControl("lnkTaskName");
Literal litTaskName = (Literal)e.Row.FindControl("litTaskName");
Literal litTaskDuration = (Literal)e.Row.FindControl("litTaskDuration"); Literal litTaskDuration = (Literal)e.Row.FindControl("litTaskDuration");
Panel pnlProgressBarContainer = (Panel)e.Row.FindControl("pnlProgressBarContainer");
Panel pnlProgressIndicator = (Panel)e.Row.FindControl("pnlProgressIndicator"); Panel pnlProgressIndicator = (Panel)e.Row.FindControl("pnlProgressIndicator");
Literal litProgressIndicator = (Literal)e.Row.FindControl("litProgressIndicator");
LinkButton cmdStop = (LinkButton)e.Row.FindControl("cmdStop"); LinkButton cmdStop = (LinkButton)e.Row.FindControl("cmdStop");
if (String.IsNullOrEmpty(task.TaskId)) // bind controls
{ lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
litTaskName.Visible = true; lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details");
litProgressIndicator.Visible = true;
// bind controls
litTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
}
else
{
lnkTaskName.Visible = true;
pnlProgressBarContainer.Visible = true;
cmdStop.Visible = true;
// bind controls
lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details");
lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
// stop button
cmdStop.CommandArgument = task.TaskId;
}
// duration // duration
TimeSpan duration = (TimeSpan)(DateTime.Now - task.StartDate); TimeSpan duration = (TimeSpan)(DateTime.Now - task.StartDate);
@ -107,6 +86,9 @@ namespace WebsitePanel.Portal
if (task.IndicatorMaximum > 0) if (task.IndicatorMaximum > 0)
percent = task.IndicatorCurrent * 100 / task.IndicatorMaximum; percent = task.IndicatorCurrent * 100 / task.IndicatorMaximum;
pnlProgressIndicator.Width = Unit.Percentage(percent); pnlProgressIndicator.Width = Unit.Percentage(percent);
// stop button
cmdStop.CommandArgument = task.TaskId;
} }
protected void gvTasks_RowCommand(object sender, GridViewCommandEventArgs e) protected void gvTasks_RowCommand(object sender, GridViewCommandEventArgs e)

View file

@ -51,7 +51,7 @@ namespace WebsitePanel.Portal
private void BindTask() private void BindTask()
{ {
DateTime lastLogDate = DateTime.MinValue; DateTime lastLogDate = DateTime.Now.AddYears(-1);
if (ViewState["lastLogDate"] != null) if (ViewState["lastLogDate"] != null)
lastLogDate = (DateTime)ViewState["lastLogDate"]; lastLogDate = (DateTime)ViewState["lastLogDate"];