@ -2,6 +2,7 @@ using System;
using System.Collections.Generic ;
using System.Linq ;
using NLog ;
using NzbDrone.Common.Cache ;
using NzbDrone.Core.Backup ;
using NzbDrone.Core.Books.Commands ;
using NzbDrone.Core.Configuration ;
@ -31,43 +32,81 @@ namespace NzbDrone.Core.Jobs
private readonly IScheduledTaskRepository _scheduledTaskRepository ;
private readonly IConfigService _configService ;
private readonly Logger _logger ;
private readonly ICached < ScheduledTask > _cache ;
public TaskManager ( IScheduledTaskRepository scheduledTaskRepository , IConfigService configService , Logger logger )
public TaskManager ( IScheduledTaskRepository scheduledTaskRepository , IConfigService configService , ICacheManager cacheManager , Logger logger )
{
_scheduledTaskRepository = scheduledTaskRepository ;
_configService = configService ;
_cache = cacheManager . GetCache < ScheduledTask > ( GetType ( ) ) ;
_logger = logger ;
}
public IList < ScheduledTask > GetPending ( )
{
return _ scheduledTaskRepository. All ( )
return _ cache. Values
. Where ( c = > c . Interval > 0 & & c . LastExecution . AddMinutes ( c . Interval ) < DateTime . UtcNow )
. ToList ( ) ;
}
public List < ScheduledTask > GetAll ( )
{
return _ scheduledTaskRepository. All ( ) . ToList ( ) ;
return _ cache. Values . ToList ( ) ;
}
public DateTime GetNextExecution ( Type type )
{
var scheduledTask = _scheduledTaskRepository . All ( ) . Single ( v = > v . TypeName = = type . FullName ) ;
var scheduledTask = _cache . Find ( type . FullName ) ;
return scheduledTask . LastExecution . AddMinutes ( scheduledTask . Interval ) ;
}
public void Handle ( ApplicationStartedEvent message )
{
var defaultTasks = new [ ]
var defaultTasks = new List < ScheduledTask >
{
new ScheduledTask
{
Interval = 1 ,
TypeName = typeof ( RefreshMonitoredDownloadsCommand ) . FullName ,
Priority = CommandPriority . High
} ,
new ScheduledTask
{
Interval = 5 ,
TypeName = typeof ( MessagingCleanupCommand ) . FullName
} ,
new ScheduledTask
{
Interval = 6 * 60 ,
TypeName = typeof ( ApplicationUpdateCheckCommand ) . FullName
} ,
new ScheduledTask
{
Interval = 6 * 60 ,
TypeName = typeof ( CheckHealthCommand ) . FullName
} ,
new ScheduledTask
{
Interval = 24 * 60 ,
TypeName = typeof ( RefreshAuthorCommand ) . FullName
} ,
new ScheduledTask
{
new ScheduledTask { Interval = 1 , TypeName = typeof ( RefreshMonitoredDownloadsCommand ) . FullName } ,
new ScheduledTask { Interval = 5 , TypeName = typeof ( MessagingCleanupCommand ) . FullName } ,
new ScheduledTask { Interval = 6 * 60 , TypeName = typeof ( ApplicationUpdateCheckCommand ) . FullName } ,
new ScheduledTask { Interval = 6 * 60 , TypeName = typeof ( CheckHealthCommand ) . FullName } ,
new ScheduledTask { Interval = 24 * 60 , TypeName = typeof ( RefreshAuthorCommand ) . FullName } ,
new ScheduledTask { Interval = 24 * 60 , TypeName = typeof ( RescanFoldersCommand ) . FullName } ,
new ScheduledTask { Interval = 24 * 60 , TypeName = typeof ( HousekeepingCommand ) . FullName } ,
Interval = 24 * 60 ,
TypeName = typeof ( RescanFoldersCommand ) . FullName
} ,
new ScheduledTask
{
Interval = 24 * 60 ,
TypeName = typeof ( HousekeepingCommand ) . FullName
} ,
new ScheduledTask
{
@ -90,7 +129,7 @@ namespace NzbDrone.Core.Jobs
var currentTasks = _scheduledTaskRepository . All ( ) . ToList ( ) ;
_logger . Trace ( "Initializing jobs. Available: {0} Existing: {1}" , defaultTasks . Count () , currentTasks . Count ( ) ) ;
_logger . Trace ( "Initializing jobs. Available: {0} Existing: {1}" , defaultTasks . Count , currentTasks . Count ) ;
foreach ( var job in currentTasks )
{
@ -112,6 +151,9 @@ namespace NzbDrone.Core.Jobs
currentDefinition . LastExecution = DateTime . UtcNow ;
}
currentDefinition . Priority = defaultTask . Priority ;
_cache . Set ( currentDefinition . TypeName , currentDefinition ) ;
_scheduledTaskRepository . Upsert ( currentDefinition ) ;
}
}
@ -152,7 +194,16 @@ namespace NzbDrone.Core.Jobs
if ( scheduledTask ! = null & & message . Command . Body . UpdateScheduledTask )
{
_logger . Trace ( "Updating last run time for: {0}" , scheduledTask . TypeName ) ;
_scheduledTaskRepository . SetLastExecutionTime ( scheduledTask . Id , DateTime . UtcNow , message . Command . StartedAt . Value ) ;
var lastExecution = DateTime . UtcNow ;
var startTime = message . Command . StartedAt . Value ;
_scheduledTaskRepository . SetLastExecutionTime ( scheduledTask . Id , lastExecution , startTime ) ;
var cached = _cache . Find ( scheduledTask . TypeName ) ;
cached . LastExecution = lastExecution ;
cached . LastStartTime = startTime ;
}
}
@ -165,6 +216,9 @@ namespace NzbDrone.Core.Jobs
backup . Interval = GetBackupInterval ( ) ;
_scheduledTaskRepository . UpdateMany ( new List < ScheduledTask > { rss , backup } ) ;
_cache . Find ( rss . TypeName ) . Interval = rss . Interval ;
_cache . Find ( backup . TypeName ) . Interval = backup . Interval ;
}
}
}