fixed status running task & remove re-start scheduling from controller(add field lastfinish - update sql)

This commit is contained in:
vfedosevich 2013-05-15 20:43:41 +03:00
parent c443d94ac3
commit 59b097b10b
6 changed files with 389 additions and 11 deletions

View file

@ -449,4 +449,364 @@ BEGIN
INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery]) INSERT [dbo].[Providers] ([ProviderID], [GroupID], [ProviderName], [DisplayName], [ProviderType], [EditorControl], [DisableAutoDiscovery])
VALUES (1401, 41, N'Lync2013', N'Microsoft Lync Server 2013 Multitenant Hosting Pack', N'WebsitePanel.Providers.HostedSolution.Lync2013, WebsitePanel.Providers.HostedSolution.Lync2013', N'Lync', NULL) VALUES (1401, 41, N'Lync2013', N'Microsoft Lync Server 2013 Multitenant Hosting Pack', N'WebsitePanel.Providers.HostedSolution.Lync2013, WebsitePanel.Providers.HostedSolution.Lync2013', N'Lync', NULL)
END END
GO
-- Scheduler Service
ALTER TABLE Schedule
ADD LastFinish DATETIME NULL
GO
UPDATE Schedule SET LastFinish = LastRun
GO
ALTER PROCEDURE [dbo].[GetSchedule]
(
@ActorID int,
@ScheduleID int
)
AS
-- select schedule
SELECT TOP 1
S.ScheduleID,
S.TaskID,
S.PackageID,
S.ScheduleName,
S.ScheduleTypeID,
S.Interval,
S.FromTime,
S.ToTime,
S.StartTime,
S.LastRun,
S.LastFinish,
S.NextRun,
S.Enabled,
S.HistoriesNumber,
S.PriorityID,
S.MaxExecutionTime,
S.WeekMonthDay,
1 AS StatusID
FROM Schedule AS S
WHERE
S.ScheduleID = @ScheduleID
AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1
-- select task
SELECT
ST.TaskID,
ST.TaskType,
ST.RoleID
FROM Schedule AS S
INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID
WHERE
S.ScheduleID = @ScheduleID
AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1
-- select schedule parameters
SELECT
S.ScheduleID,
STP.ParameterID,
STP.DataTypeID,
ISNULL(SP.ParameterValue, STP.DefaultValue) AS ParameterValue
FROM Schedule AS S
INNER JOIN ScheduleTaskParameters AS STP ON S.TaskID = STP.TaskID
LEFT OUTER JOIN ScheduleParameters AS SP ON STP.ParameterID = SP.ParameterID AND SP.ScheduleID = S.ScheduleID
WHERE
S.ScheduleID = @ScheduleID
AND dbo.CheckActorPackageRights(@ActorID, S.PackageID) = 1
RETURN
GO
ALTER PROCEDURE [dbo].[GetScheduleInternal]
(
@ScheduleID int
)
AS
-- select schedule
SELECT
S.ScheduleID,
S.TaskID,
ST.TaskType,
ST.RoleID,
S.PackageID,
S.ScheduleName,
S.ScheduleTypeID,
S.Interval,
S.FromTime,
S.ToTime,
S.StartTime,
S.LastRun,
S.LastFinish,
S.NextRun,
S.Enabled,
1 AS StatusID,
S.PriorityID,
S.HistoriesNumber,
S.MaxExecutionTime,
S.WeekMonthDay
FROM Schedule AS S
INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID
WHERE ScheduleID = @ScheduleID
RETURN
GO
ALTER PROCEDURE [dbo].[GetSchedules]
(
@ActorID int,
@PackageID int,
@Recursive bit
)
AS
-- check rights
IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0
RAISERROR('You are not allowed to access this package', 16, 1)
DECLARE @Schedules TABLE
(
ScheduleID int
)
INSERT INTO @Schedules (ScheduleID)
SELECT
S.ScheduleID
FROM Schedule AS S
INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID
ORDER BY S.Enabled DESC, S.NextRun
-- select schedules
SELECT
S.ScheduleID,
S.TaskID,
ST.TaskType,
ST.RoleID,
S.PackageID,
S.ScheduleName,
S.ScheduleTypeID,
S.Interval,
S.FromTime,
S.ToTime,
S.StartTime,
S.LastRun,
S.LastFinish,
S.NextRun,
S.Enabled,
1 AS StatusID,
S.PriorityID,
S.MaxExecutionTime,
S.WeekMonthDay,
ISNULL(0, (SELECT TOP 1 SeverityID FROM AuditLog WHERE ItemID = S.ScheduleID AND SourceName = 'SCHEDULER' ORDER BY StartDate DESC)) AS LastResult,
U.Username,
U.FirstName,
U.LastName,
U.FullName,
U.RoleID,
U.Email
FROM @Schedules AS STEMP
INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID
INNER JOIN Packages AS P ON S.PackageID = P.PackageID
INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID
INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID
-- select schedule parameters
SELECT
S.ScheduleID,
STP.ParameterID,
STP.DataTypeID,
ISNULL(SP.ParameterValue, STP.DefaultValue) AS ParameterValue
FROM @Schedules AS STEMP
INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID
INNER JOIN ScheduleTaskParameters AS STP ON S.TaskID = STP.TaskID
LEFT OUTER JOIN ScheduleParameters AS SP ON STP.ParameterID = SP.ParameterID AND SP.ScheduleID = S.ScheduleID
RETURN
GO
ALTER PROCEDURE [dbo].[GetSchedulesPaged]
(
@ActorID int,
@PackageID int,
@Recursive bit,
@FilterColumn nvarchar(50) = '',
@FilterValue nvarchar(50) = '',
@SortColumn nvarchar(50),
@StartRow int,
@MaximumRows int
)
AS
BEGIN
-- check rights
IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0
RAISERROR('You are not allowed to access this package', 16, 1)
DECLARE @condition nvarchar(400)
SET @condition = ' 1 = 1 '
IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL
AND @FilterValue <> '' AND @FilterValue IS NOT NULL
SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + ''''
IF @SortColumn IS NULL OR @SortColumn = ''
SET @SortColumn = 'S.ScheduleName ASC'
DECLARE @sql nvarchar(3500)
set @sql = '
SELECT COUNT(S.ScheduleID) FROM Schedule AS S
INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID
INNER JOIN Packages AS P ON S.PackageID = P.PackageID
INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID
WHERE ' + @condition + '
DECLARE @Schedules AS TABLE
(
ScheduleID int
);
WITH TempSchedules AS (
SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row,
S.ScheduleID
FROM Schedule AS S
INNER JOIN Packages AS P ON S.PackageID = P.PackageID
INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON S.PackageID = PT.PackageID
INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID
WHERE ' + @condition + '
)
INSERT INTO @Schedules
SELECT ScheduleID FROM TempSchedules
WHERE TempSchedules.Row BETWEEN @StartRow and @StartRow + @MaximumRows - 1
SELECT
S.ScheduleID,
S.TaskID,
ST.TaskType,
ST.RoleID,
S.ScheduleName,
S.ScheduleTypeID,
S.Interval,
S.FromTime,
S.ToTime,
S.StartTime,
S.LastRun,
S.LastFinish,
S.NextRun,
S.Enabled,
1 AS StatusID,
S.PriorityID,
S.MaxExecutionTime,
S.WeekMonthDay,
ISNULL(0, (SELECT TOP 1 SeverityID FROM AuditLog WHERE ItemID = S.ScheduleID AND SourceName = ''SCHEDULER'' ORDER BY StartDate DESC)) AS LastResult,
-- packages
P.PackageID,
P.PackageName,
-- user
P.UserID,
U.Username,
U.FirstName,
U.LastName,
U.FullName,
U.RoleID,
U.Email
FROM @Schedules AS STEMP
INNER JOIN Schedule AS S ON STEMP.ScheduleID = S.ScheduleID
INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID
INNER JOIN Packages AS P ON S.PackageID = P.PackageID
INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID'
exec sp_executesql @sql, N'@PackageID int, @StartRow int, @MaximumRows int, @Recursive bit',
@PackageID, @StartRow, @MaximumRows, @Recursive
END
RETURN
GO
ALTER PROCEDURE [dbo].[UpdateSchedule]
(
@ActorID int,
@ScheduleID int,
@TaskID nvarchar(100),
@ScheduleName nvarchar(100),
@ScheduleTypeID nvarchar(50),
@Interval int,
@FromTime datetime,
@ToTime datetime,
@StartTime datetime,
@LastRun datetime,
@LastFinish datetime,
@NextRun datetime,
@Enabled bit,
@PriorityID nvarchar(50),
@HistoriesNumber int,
@MaxExecutionTime int,
@WeekMonthDay int,
@XmlParameters ntext
)
AS
-- check rights
DECLARE @PackageID int
SELECT @PackageID = PackageID FROM Schedule
WHERE ScheduleID = @ScheduleID
IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0
RAISERROR('You are not allowed to access this package', 16, 1)
BEGIN TRAN
UPDATE Schedule
SET
TaskID = @TaskID,
ScheduleName = @ScheduleName,
ScheduleTypeID = @ScheduleTypeID,
Interval = @Interval,
FromTime = @FromTime,
ToTime = @ToTime,
StartTime = @StartTime,
LastRun = @LastRun,
LastFinish = @LastFinish,
NextRun = @NextRun,
Enabled = @Enabled,
PriorityID = @PriorityID,
HistoriesNumber = @HistoriesNumber,
MaxExecutionTime = @MaxExecutionTime,
WeekMonthDay = @WeekMonthDay
WHERE
ScheduleID = @ScheduleID
DECLARE @idoc int
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @XmlParameters
-- Execute a SELECT statement that uses the OPENXML rowset provider.
DELETE FROM ScheduleParameters
WHERE ScheduleID = @ScheduleID
INSERT INTO ScheduleParameters
(
ScheduleID,
ParameterID,
ParameterValue
)
SELECT
@ScheduleID,
ParameterID,
ParameterValue
FROM OPENXML(@idoc, '/parameters/parameter',1) WITH
(
ParameterID nvarchar(50) '@id',
ParameterValue nvarchar(3000) '@value'
) as PV
-- remove document
exec sp_xml_removedocument @idoc
COMMIT TRAN
RETURN
GO GO

View file

@ -45,6 +45,7 @@ namespace WebsitePanel.EnterpriseServer
private DateTime toTime; private DateTime toTime;
private DateTime startTime; private DateTime startTime;
private DateTime lastRun; private DateTime lastRun;
private DateTime lastFinish;
private DateTime nextRun; private DateTime nextRun;
private bool enabled; private bool enabled;
private string statusId; private string statusId;
@ -121,6 +122,12 @@ namespace WebsitePanel.EnterpriseServer
set { this.lastRun = value; } set { this.lastRun = value; }
} }
public System.DateTime LastFinish
{
get { return this.lastFinish; }
set { this.lastFinish = value; }
}
public System.DateTime NextRun public System.DateTime NextRun
{ {
get { return this.nextRun; } get { return this.nextRun; }

View file

@ -1945,11 +1945,12 @@ namespace WebsitePanel.EnterpriseServer
// read identity // read identity
return Convert.ToInt32(prmId.Value); return Convert.ToInt32(prmId.Value);
} }
public static void UpdateSchedule(int actorId, int scheduleId, string taskId, public static void UpdateSchedule(int actorId, int scheduleId, string taskId,
string scheduleName, string scheduleTypeId, int interval, string scheduleName, string scheduleTypeId, int interval,
DateTime fromTime, DateTime toTime, DateTime startTime, DateTime fromTime, DateTime toTime, DateTime startTime,
DateTime lastRun, DateTime nextRun, bool enabled, string priorityId, int historiesNumber, DateTime lastRun, DateTime lastFinish, DateTime nextRun, bool enabled, string priorityId,
int maxExecutionTime, int weekMonthDay, string xmlParameters) int historiesNumber, int maxExecutionTime, int weekMonthDay, string xmlParameters)
{ {
SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "UpdateSchedule", ObjectQualifier + "UpdateSchedule",
@ -1963,6 +1964,7 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@toTime", toTime), new SqlParameter("@toTime", toTime),
new SqlParameter("@startTime", startTime), new SqlParameter("@startTime", startTime),
new SqlParameter("@lastRun", (lastRun == DateTime.MinValue) ? DBNull.Value : (object)lastRun), new SqlParameter("@lastRun", (lastRun == DateTime.MinValue) ? DBNull.Value : (object)lastRun),
new SqlParameter("@lastFinish", (lastFinish == DateTime.MinValue) ? DBNull.Value : (object)lastFinish),
new SqlParameter("@nextRun", nextRun), new SqlParameter("@nextRun", nextRun),
new SqlParameter("@enabled", enabled), new SqlParameter("@enabled", enabled),
new SqlParameter("@priorityId", priorityId), new SqlParameter("@priorityId", priorityId),
@ -1971,6 +1973,7 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@weekMonthDay", weekMonthDay), new SqlParameter("@weekMonthDay", weekMonthDay),
new SqlParameter("@xmlParameters", xmlParameters)); new SqlParameter("@xmlParameters", xmlParameters));
} }
public static void DeleteSchedule(int actorId, int scheduleId) public static void DeleteSchedule(int actorId, int scheduleId)
{ {
SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure,

View file

@ -58,13 +58,15 @@ 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();
return scheduledTasks.ContainsKey(scheduleId);
ScheduleInfo scheduleInfo = SchedulerController.GetSchedule(scheduleId);
return scheduledTasks.ContainsKey(scheduleId) || scheduleInfo.LastRun > scheduleInfo.LastFinish;
} }
public static void StartSchedule(SchedulerJob schedule) public static void StartSchedule(SchedulerJob schedule)
{ {
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks(); if (IsScheduleActive(schedule.ScheduleInfo.ScheduleId))
if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
return; return;
// run schedule // run schedule
@ -125,8 +127,6 @@ namespace WebsitePanel.EnterpriseServer
static void RunSchedule(SchedulerJob schedule, bool changeNextRun) static void RunSchedule(SchedulerJob schedule, bool changeNextRun)
{ {
try try
{ {
// update next run (if required) // update next run (if required)

View file

@ -275,7 +275,7 @@ namespace WebsitePanel.EnterpriseServer
schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters); schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters);
// re-schedule tasks // re-schedule tasks
Scheduler.ScheduleTasks(); //Scheduler.ScheduleTasks();
return scheduleId; return scheduleId;
} }
@ -297,11 +297,11 @@ namespace WebsitePanel.EnterpriseServer
DataProvider.UpdateSchedule(SecurityContext.User.UserId, DataProvider.UpdateSchedule(SecurityContext.User.UserId,
schedule.ScheduleId, schedule.TaskId, schedule.ScheduleName, schedule.ScheduleTypeId, schedule.ScheduleId, schedule.TaskId, schedule.ScheduleName, schedule.ScheduleTypeId,
schedule.Interval, schedule.FromTime, schedule.ToTime, schedule.StartTime, schedule.Interval, schedule.FromTime, schedule.ToTime, schedule.StartTime,
schedule.LastRun, schedule.NextRun, schedule.Enabled, schedule.PriorityId, schedule.LastRun, schedule.LastFinish, schedule.NextRun, schedule.Enabled, schedule.PriorityId,
schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters); schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters);
// re-schedule tasks // re-schedule tasks
Scheduler.ScheduleTasks(); //Scheduler.ScheduleTasks();
return 0; return 0;
} }
@ -336,7 +336,7 @@ namespace WebsitePanel.EnterpriseServer
DataProvider.DeleteSchedule(SecurityContext.User.UserId, scheduleId); DataProvider.DeleteSchedule(SecurityContext.User.UserId, scheduleId);
// re-schedule tasks // re-schedule tasks
Scheduler.ScheduleTasks(); //Scheduler.ScheduleTasks();
return 0; return 0;
} }

View file

@ -223,6 +223,14 @@ namespace WebsitePanel.EnterpriseServer
TopTask.TaskName, executionLog); TopTask.TaskName, executionLog);
} }
// update last finish time
ScheduleInfo scheduleInfo = SchedulerController.GetSchedule(TopTask.ItemId);
if (scheduleInfo != null)
{
scheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(scheduleInfo);
}
// remove task from the stack // remove task from the stack
TasksStack.RemoveAt(TasksStack.Count - 1); TasksStack.RemoveAt(TasksStack.Count - 1);
} }