diff options
Diffstat (limited to 'MediaBrowser.Common/ScheduledTasks')
16 files changed, 170 insertions, 813 deletions
diff --git a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs index 845faf31a..09ceaa9ae 100644 --- a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Kernel; -using MediaBrowser.Common.Serialization; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Tasks; using System; @@ -90,7 +89,7 @@ namespace MediaBrowser.Common.ScheduledTasks { try { - return JsonSerializer.DeserializeFromFile<TaskResult>(HistoryFilePath); + return TaskManager.GetLastExecutionResult(this); } catch (IOException) { @@ -110,74 +109,6 @@ namespace MediaBrowser.Common.ScheduledTasks } /// <summary> - /// The _scheduled tasks data directory - /// </summary> - private string _scheduledTasksDataDirectory; - /// <summary> - /// Gets the scheduled tasks data directory. - /// </summary> - /// <value>The scheduled tasks data directory.</value> - private string ScheduledTasksDataDirectory - { - get - { - if (_scheduledTasksDataDirectory == null) - { - _scheduledTasksDataDirectory = Path.Combine(Kernel.ApplicationPaths.DataPath, "ScheduledTasks"); - - if (!Directory.Exists(_scheduledTasksDataDirectory)) - { - Directory.CreateDirectory(_scheduledTasksDataDirectory); - } - } - return _scheduledTasksDataDirectory; - } - } - - /// <summary> - /// The _scheduled tasks configuration directory - /// </summary> - private string _scheduledTasksConfigurationDirectory; - /// <summary> - /// Gets the scheduled tasks configuration directory. - /// </summary> - /// <value>The scheduled tasks configuration directory.</value> - private string ScheduledTasksConfigurationDirectory - { - get - { - if (_scheduledTasksConfigurationDirectory == null) - { - _scheduledTasksConfigurationDirectory = Path.Combine(Kernel.ApplicationPaths.ConfigurationDirectoryPath, "ScheduledTasks"); - - if (!Directory.Exists(_scheduledTasksConfigurationDirectory)) - { - Directory.CreateDirectory(_scheduledTasksConfigurationDirectory); - } - } - return _scheduledTasksConfigurationDirectory; - } - } - - /// <summary> - /// Gets the configuration file path. - /// </summary> - /// <value>The configuration file path.</value> - private string ConfigurationFilePath - { - get { return Path.Combine(ScheduledTasksConfigurationDirectory, Id + ".js"); } - } - - /// <summary> - /// Gets the history file path. - /// </summary> - /// <value>The history file path.</value> - private string HistoryFilePath - { - get { return Path.Combine(ScheduledTasksDataDirectory, Id + ".js"); } - } - - /// <summary> /// Gets the current cancellation token /// </summary> /// <value>The current cancellation token source.</value> @@ -217,7 +148,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// The _triggers /// </summary> - private IEnumerable<BaseTaskTrigger> _triggers; + private IEnumerable<ITaskTrigger> _triggers; /// <summary> /// The _triggers initialized /// </summary> @@ -231,24 +162,11 @@ namespace MediaBrowser.Common.ScheduledTasks /// </summary> /// <value>The triggers.</value> /// <exception cref="System.ArgumentNullException">value</exception> - public IEnumerable<BaseTaskTrigger> Triggers + public IEnumerable<ITaskTrigger> Triggers { get { - LazyInitializer.EnsureInitialized(ref _triggers, ref _triggersInitialized, ref _triggersSyncLock, () => - { - try - { - return JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(ConfigurationFilePath) - .Select(ScheduledTaskHelpers.GetTrigger) - .ToList(); - } - catch (IOException) - { - // File doesn't exist. No biggie. Return defaults. - return GetDefaultTriggers(); - } - }); + LazyInitializer.EnsureInitialized(ref _triggers, ref _triggersInitialized, ref _triggersSyncLock, () => TaskManager.LoadTriggers(this)); return _triggers; } @@ -271,7 +189,7 @@ namespace MediaBrowser.Common.ScheduledTasks ReloadTriggerEvents(false); - JsonSerializer.SerializeToFile(_triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), ConfigurationFilePath); + TaskManager.SaveTriggers(this, _triggers); } } @@ -279,7 +197,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Creates the triggers that define when the task will run /// </summary> /// <returns>IEnumerable{BaseTaskTrigger}.</returns> - protected abstract IEnumerable<BaseTaskTrigger> GetDefaultTriggers(); + public abstract IEnumerable<ITaskTrigger> GetDefaultTriggers(); /// <summary> /// Returns the task to be executed @@ -314,6 +232,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// The _id /// </summary> private Guid? _id; + /// <summary> /// Gets the unique id. /// </summary> @@ -352,13 +271,19 @@ namespace MediaBrowser.Common.ScheduledTasks /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> - void trigger_Triggered(object sender, EventArgs e) + async void trigger_Triggered(object sender, EventArgs e) { - var trigger = (BaseTaskTrigger)sender; + var trigger = (ITaskTrigger)sender; Logger.Info("{0} fired for task: {1}", trigger.GetType().Name, Name); + trigger.Stop(); + TaskManager.QueueScheduledTask(this); + + await Task.Delay(1000).ConfigureAwait(false); + + trigger.Start(false); } /// <summary> @@ -404,10 +329,9 @@ namespace MediaBrowser.Common.ScheduledTasks status = TaskCompletionStatus.Failed; } + var startTime = CurrentExecutionStartTime; var endTime = DateTime.UtcNow; - LogResult(endTime, status); - Kernel.TcpManager.SendWebSocketMessage("ScheduledTaskEndExecute", LastExecutionResult); progress.ProgressChanged -= progress_ProgressChanged; @@ -415,33 +339,7 @@ namespace MediaBrowser.Common.ScheduledTasks CurrentCancellationTokenSource = null; CurrentProgress = null; - TaskManager.OnTaskCompleted(this); - } - - /// <summary> - /// Logs the result. - /// </summary> - /// <param name="endTime">The end time.</param> - /// <param name="status">The status.</param> - private void LogResult(DateTime endTime, TaskCompletionStatus status) - { - var startTime = CurrentExecutionStartTime; - var elapsedTime = endTime - startTime; - - Logger.Info("{0} {1} after {2} minute(s) and {3} seconds", Name, status, Math.Truncate(elapsedTime.TotalMinutes), elapsedTime.Seconds); - - var result = new TaskResult - { - StartTimeUtc = startTime, - EndTimeUtc = endTime, - Status = status, - Name = Name, - Id = Id - }; - - JsonSerializer.SerializeToFile(result, HistoryFilePath); - - LastExecutionResult = result; + TaskManager.OnTaskCompleted(this, startTime, endTime, status); } /// <summary> @@ -501,7 +399,7 @@ namespace MediaBrowser.Common.ScheduledTasks if (State == TaskState.Running) { - LogResult(DateTime.UtcNow, TaskCompletionStatus.Aborted); + TaskManager.OnTaskCompleted(this, CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted); } if (CurrentCancellationTokenSource != null) @@ -519,7 +417,7 @@ namespace MediaBrowser.Common.ScheduledTasks foreach (var trigger in Triggers) { trigger.Triggered -= trigger_Triggered; - trigger.Dispose(); + trigger.Stop(); } } } diff --git a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs deleted file mode 100644 index ed302ed39..000000000 --- a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// <summary> - /// Use to indicate that a scheduled task should run - /// </summary> - public abstract class BaseTaskTrigger : IDisposable - { - /// <summary> - /// Fires when the trigger condition is satisfied and the task should run - /// </summary> - internal event EventHandler<EventArgs> Triggered; - - /// <summary> - /// Called when [triggered]. - /// </summary> - protected async void OnTriggered() - { - Stop(); - - if (Triggered != null) - { - Triggered(this, EventArgs.Empty); - } - - await Task.Delay(1000).ConfigureAwait(false); - - Start(false); - } - - /// <summary> - /// Stars waiting for the trigger action - /// </summary> - protected internal abstract void Start(bool isApplicationStartup); - - /// <summary> - /// Stops waiting for the trigger action - /// </summary> - protected internal abstract void Stop(); - - /// <summary> - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// </summary> - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// <summary> - /// Releases unmanaged and - optionally - managed resources. - /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected virtual void Dispose(bool dispose) - { - if (dispose) - { - Stop(); - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs index fb749f77c..bfecadee7 100644 --- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs @@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Represents a task trigger that fires everyday /// </summary> - public class DailyTrigger : BaseTaskTrigger + public class DailyTrigger : ITaskTrigger { /// <summary> /// Get the time of day to trigger the task to run @@ -24,7 +24,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Stars waiting for the trigger action /// </summary> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> - protected internal override void Start(bool isApplicationStartup) + public void Start(bool isApplicationStartup) { DisposeTimer(); @@ -39,33 +39,35 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stops waiting for the trigger action /// </summary> - protected internal override void Stop() + public void Stop() { DisposeTimer(); } /// <summary> - /// Disposes this instance. + /// Disposes the timer. /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected override void Dispose(bool dispose) + private void DisposeTimer() { - if (dispose) + if (Timer != null) { - DisposeTimer(); + Timer.Dispose(); } - - base.Dispose(dispose); } /// <summary> - /// Disposes the timer. + /// Occurs when [triggered]. /// </summary> - private void DisposeTimer() + public event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() { - if (Timer != null) + if (Triggered != null) { - Timer.Dispose(); + Triggered(this, EventArgs.Empty); } } } diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs index cba5fc5d0..6f3a3857f 100644 --- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs +++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs @@ -14,7 +14,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Gets the triggers. /// </summary> /// <value>The triggers.</value> - IEnumerable<BaseTaskTrigger> Triggers { get; set; } + IEnumerable<ITaskTrigger> Triggers { get; set; } /// <summary> /// Gets the last execution result. @@ -75,5 +75,11 @@ namespace MediaBrowser.Common.ScheduledTasks /// Cancels if running. /// </summary> void CancelIfRunning(); + + /// <summary> + /// Gets the default triggers. + /// </summary> + /// <returns>IEnumerable{BaseTaskTrigger}.</returns> + IEnumerable<ITaskTrigger> GetDefaultTriggers(); } }
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs index 430208869..42d7020e6 100644 --- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs +++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs @@ -1,4 +1,5 @@ -using System; +using MediaBrowser.Model.Tasks; +using System; using System.Collections.Generic; namespace MediaBrowser.Common.ScheduledTasks @@ -41,6 +42,30 @@ namespace MediaBrowser.Common.ScheduledTasks /// Called when [task completed]. /// </summary> /// <param name="task">The task.</param> - void OnTaskCompleted(IScheduledTask task); + /// <param name="startTime">The start time.</param> + /// <param name="endTime">The end time.</param> + /// <param name="status">The status.</param> + void OnTaskCompleted(IScheduledTask task, DateTime startTime, DateTime endTime, TaskCompletionStatus status); + + /// <summary> + /// Gets the last execution result. + /// </summary> + /// <param name="task">The task.</param> + /// <returns>TaskResult.</returns> + TaskResult GetLastExecutionResult(IScheduledTask task); + + /// <summary> + /// Loads the triggers. + /// </summary> + /// <param name="task">The task.</param> + /// <returns>IEnumerable{BaseTaskTrigger}.</returns> + IEnumerable<ITaskTrigger> LoadTriggers(IScheduledTask task); + + /// <summary> + /// Saves the triggers. + /// </summary> + /// <param name="task">The task.</param> + /// <param name="triggers">The triggers.</param> + void SaveTriggers(IScheduledTask task, IEnumerable<ITaskTrigger> triggers); } }
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs new file mode 100644 index 000000000..66701650e --- /dev/null +++ b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs @@ -0,0 +1,26 @@ +using System; + +namespace MediaBrowser.Common.ScheduledTasks +{ + /// <summary> + /// Interface ITaskTrigger + /// </summary> + public interface ITaskTrigger + { + /// <summary> + /// Fires when the trigger condition is satisfied and the task should run + /// </summary> + event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Stars waiting for the trigger action + /// </summary> + /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> + void Start(bool isApplicationStartup); + + /// <summary> + /// Stops waiting for the trigger action + /// </summary> + void Stop(); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs index 759447b10..cac6d1fa3 100644 --- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs @@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Represents a task trigger that runs repeatedly on an interval /// </summary> - public class IntervalTrigger : BaseTaskTrigger + public class IntervalTrigger : ITaskTrigger { /// <summary> /// Gets or sets the interval. @@ -24,7 +24,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Stars waiting for the trigger action /// </summary> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> - protected internal override void Start(bool isApplicationStartup) + public void Start(bool isApplicationStartup) { DisposeTimer(); @@ -34,33 +34,35 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stops waiting for the trigger action /// </summary> - protected internal override void Stop() + public void Stop() { DisposeTimer(); } /// <summary> - /// Disposes this instance. + /// Disposes the timer. /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected override void Dispose(bool dispose) + private void DisposeTimer() { - if (dispose) + if (Timer != null) { - DisposeTimer(); + Timer.Dispose(); } - - base.Dispose(dispose); } /// <summary> - /// Disposes the timer. + /// Occurs when [triggered]. /// </summary> - private void DisposeTimer() + public event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() { - if (Timer != null) + if (Triggered != null) { - Timer.Dispose(); + Triggered(this, EventArgs.Empty); } } } diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs index 9942da17f..e67eb3626 100644 --- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs +++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs @@ -35,7 +35,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// </summary> /// <param name="trigger">The trigger.</param> /// <returns>TaskTriggerInfo.</returns> - public static TaskTriggerInfo GetTriggerInfo(BaseTaskTrigger trigger) + public static TaskTriggerInfo GetTriggerInfo(ITaskTrigger trigger) { var info = new TaskTriggerInfo { @@ -81,7 +81,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <returns>BaseTaskTrigger.</returns> /// <exception cref="System.ArgumentNullException"></exception> /// <exception cref="System.ArgumentException">Invalid trigger type: + info.Type</exception> - public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info) + public static ITaskTrigger GetTrigger(TaskTriggerInfo info) { if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase)) { diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs index a254d2be9..e48551425 100644 --- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs @@ -1,17 +1,18 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace MediaBrowser.Common.ScheduledTasks { /// <summary> /// Class StartupTaskTrigger /// </summary> - public class StartupTrigger : BaseTaskTrigger + public class StartupTrigger : ITaskTrigger { /// <summary> /// Stars waiting for the trigger action /// </summary> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> - protected internal async override void Start(bool isApplicationStartup) + public async void Start(bool isApplicationStartup) { if (isApplicationStartup) { @@ -24,8 +25,24 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stops waiting for the trigger action /// </summary> - protected internal override void Stop() + public void Stop() { } + + /// <summary> + /// Occurs when [triggered]. + /// </summary> + public event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, EventArgs.Empty); + } + } } } diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs index 45d1fae8e..751da0ca5 100644 --- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs @@ -1,5 +1,6 @@ using MediaBrowser.Model.Tasks; using Microsoft.Win32; +using System; using System.Threading.Tasks; namespace MediaBrowser.Common.ScheduledTasks @@ -7,7 +8,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Class SystemEventTrigger /// </summary> - public class SystemEventTrigger : BaseTaskTrigger + public class SystemEventTrigger : ITaskTrigger { /// <summary> /// Gets or sets the system event. @@ -19,7 +20,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Stars waiting for the trigger action /// </summary> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> - protected internal override void Start(bool isApplicationStartup) + public void Start(bool isApplicationStartup) { switch (SystemEvent) { @@ -32,7 +33,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stops waiting for the trigger action /// </summary> - protected internal override void Stop() + public void Stop() { SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; } @@ -52,5 +53,21 @@ namespace MediaBrowser.Common.ScheduledTasks OnTriggered(); } } + + /// <summary> + /// Occurs when [triggered]. + /// </summary> + public event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() + { + if (Triggered != null) + { + Triggered(this, EventArgs.Empty); + } + } } } diff --git a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs deleted file mode 100644 index 946c42d2e..000000000 --- a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs +++ /dev/null @@ -1,159 +0,0 @@ -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Tasks; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace MediaBrowser.Common.ScheduledTasks -{ - /// <summary> - /// Class TaskManager - /// </summary> - internal class TaskManager : ITaskManager - { - /// <summary> - /// Gets the list of Scheduled Tasks - /// </summary> - /// <value>The scheduled tasks.</value> - public IScheduledTask[] ScheduledTasks { get; private set; } - - /// <summary> - /// The _task queue - /// </summary> - private readonly List<Type> _taskQueue = new List<Type>(); - - /// <summary> - /// The _logger - /// </summary> - private readonly ILogger _logger; - - /// <summary> - /// Initializes a new instance of the <see cref="TaskManager" /> class. - /// </summary> - /// <param name="logger">The logger.</param> - public TaskManager(ILogger logger) - { - if (logger == null) - { - throw new ArgumentException("logger"); - } - - _logger = logger; - - ScheduledTasks = new IScheduledTask[] {}; - } - - /// <summary> - /// Cancels if running and queue. - /// </summary> - /// <typeparam name="T"></typeparam> - public void CancelIfRunningAndQueue<T>() - where T : IScheduledTask - { - ScheduledTasks.OfType<T>().First().CancelIfRunning(); - QueueScheduledTask<T>(); - } - - /// <summary> - /// Queues the scheduled task. - /// </summary> - /// <typeparam name="T"></typeparam> - public void QueueScheduledTask<T>() - where T : IScheduledTask - { - var scheduledTask = ScheduledTasks.OfType<T>().First(); - - QueueScheduledTask(scheduledTask); - } - - /// <summary> - /// Queues the scheduled task. - /// </summary> - /// <param name="task">The task.</param> - public void QueueScheduledTask(IScheduledTask task) - { - var type = task.GetType(); - - var scheduledTask = ScheduledTasks.First(t => t.GetType() == type); - - lock (_taskQueue) - { - // If it's idle just execute immediately - if (scheduledTask.State == TaskState.Idle) - { - scheduledTask.Execute(); - return; - } - - if (!_taskQueue.Contains(type)) - { - _logger.Info("Queueing task {0}", type.Name); - _taskQueue.Add(type); - } - else - { - _logger.Info("Task already queued: {0}", type.Name); - } - } - } - - /// <summary> - /// Called when [task completed]. - /// </summary> - /// <param name="task">The task.</param> - public void OnTaskCompleted(IScheduledTask task) - { - // Execute queued tasks - lock (_taskQueue) - { - var copy = _taskQueue.ToList(); - - foreach (var type in copy) - { - var scheduledTask = ScheduledTasks.First(t => t.GetType() == type); - - if (scheduledTask.State == TaskState.Idle) - { - scheduledTask.Execute(); - - _taskQueue.Remove(type); - } - } - } - } - - /// <summary> - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// </summary> - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// <summary> - /// Releases unmanaged and - optionally - managed resources. - /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected virtual void Dispose(bool dispose) - { - foreach (var task in ScheduledTasks) - { - task.Dispose(); - } - } - - /// <summary> - /// Adds the tasks. - /// </summary> - /// <param name="tasks">The tasks.</param> - public void AddTasks(IEnumerable<IScheduledTask> tasks) - { - var myTasks = ScheduledTasks.ToList(); - - myTasks.AddRange(tasks); - - ScheduledTasks = myTasks.ToArray(); - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs deleted file mode 100644 index b06134ee2..000000000 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs +++ /dev/null @@ -1,118 +0,0 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks.Tasks -{ - /// <summary> - /// Deletes old cache files - /// </summary> - public class DeleteCacheFileTask : BaseScheduledTask<IKernel> - { - /// <summary> - /// Initializes a new instance of the <see cref="DeleteCacheFileTask" /> class. - /// </summary> - /// <param name="kernel">The kernel.</param> - /// <param name="taskManager">The task manager.</param> - /// <param name="logger">The logger.</param> - public DeleteCacheFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) - : base(kernel, taskManager, logger) - { - } - - /// <summary> - /// Creates the triggers that define when the task will run - /// </summary> - /// <returns>IEnumerable{BaseTaskTrigger}.</returns> - protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers() - { - var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am - - return new[] { trigger }; - } - - /// <summary> - /// Returns the task to be executed - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> - protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress) - { - return Task.Run(() => - { - var minDateModified = DateTime.UtcNow.AddMonths(-2); - - DeleteCacheFilesFromDirectory(cancellationToken, Kernel.ApplicationPaths.CachePath, minDateModified, progress); - }); - } - - - /// <summary> - /// Deletes the cache files from directory with a last write time less than a given date - /// </summary> - /// <param name="cancellationToken">The task cancellation token.</param> - /// <param name="directory">The directory.</param> - /// <param name="minDateModified">The min date modified.</param> - /// <param name="progress">The progress.</param> - private void DeleteCacheFilesFromDirectory(CancellationToken cancellationToken, string directory, DateTime minDateModified, IProgress<double> progress) - { - var filesToDelete = new DirectoryInfo(directory).EnumerateFileSystemInfos("*", SearchOption.AllDirectories) - .Where(f => !f.Attributes.HasFlag(FileAttributes.Directory) && f.LastWriteTimeUtc < minDateModified) - .ToList(); - - var index = 0; - - foreach (var file in filesToDelete) - { - double percent = index; - percent /= filesToDelete.Count; - - progress.Report(100 * percent); - - cancellationToken.ThrowIfCancellationRequested(); - - File.Delete(file.FullName); - - index++; - } - - progress.Report(100); - } - - /// <summary> - /// Gets the name of the task - /// </summary> - /// <value>The name.</value> - public override string Name - { - get { return "Cache file cleanup"; } - } - - /// <summary> - /// Gets the description. - /// </summary> - /// <value>The description.</value> - public override string Description - { - get { return "Deletes cache files no longer needed by the system"; } - } - - /// <summary> - /// Gets the category. - /// </summary> - /// <value>The category.</value> - public override string Category - { - get - { - return "Maintenance"; - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs deleted file mode 100644 index 0b243cb10..000000000 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs +++ /dev/null @@ -1,106 +0,0 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks.Tasks -{ - /// <summary> - /// Deletes old log files - /// </summary> - public class DeleteLogFileTask : BaseScheduledTask<IKernel> - { - /// <summary> - /// Initializes a new instance of the <see cref="DeleteLogFileTask" /> class. - /// </summary> - /// <param name="kernel">The kernel.</param> - /// <param name="taskManager">The task manager.</param> - /// <param name="logger">The logger.</param> - public DeleteLogFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) - : base(kernel, taskManager, logger) - { - } - - /// <summary> - /// Creates the triggers that define when the task will run - /// </summary> - /// <returns>IEnumerable{BaseTaskTrigger}.</returns> - protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers() - { - var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am - - return new[] { trigger }; - } - - /// <summary> - /// Returns the task to be executed - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> - protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress) - { - return Task.Run(() => - { - // Delete log files more than n days old - var minDateModified = DateTime.UtcNow.AddDays(-(Kernel.Configuration.LogFileRetentionDays)); - - var filesToDelete = new DirectoryInfo(Kernel.ApplicationPaths.LogDirectoryPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories) - .Where(f => f.LastWriteTimeUtc < minDateModified) - .ToList(); - - var index = 0; - - foreach (var file in filesToDelete) - { - double percent = index; - percent /= filesToDelete.Count; - - progress.Report(100 * percent); - - cancellationToken.ThrowIfCancellationRequested(); - - File.Delete(file.FullName); - - index++; - } - - progress.Report(100); - }); - } - - /// <summary> - /// Gets the name of the task - /// </summary> - /// <value>The name.</value> - public override string Name - { - get { return "Log file cleanup"; } - } - - /// <summary> - /// Gets the description. - /// </summary> - /// <value>The description.</value> - public override string Description - { - get { return string.Format("Deletes log files that are more than {0} days old.", Kernel.Configuration.LogFileRetentionDays); } - } - - /// <summary> - /// Gets the category. - /// </summary> - /// <value>The category.</value> - public override string Category - { - get - { - return "Maintenance"; - } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs deleted file mode 100644 index 35cbe98f1..000000000 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs +++ /dev/null @@ -1,70 +0,0 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks.Tasks -{ - /// <summary> - /// Class ReloadLoggerFileTask - /// </summary> - public class ReloadLoggerFileTask : BaseScheduledTask<IKernel> - { - /// <summary> - /// Initializes a new instance of the <see cref="ReloadLoggerFileTask" /> class. - /// </summary> - /// <param name="kernel">The kernel.</param> - /// <param name="taskManager">The task manager.</param> - /// <param name="logger">The logger.</param> - public ReloadLoggerFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger) - : base(kernel, taskManager, logger) - { - } - - /// <summary> - /// Gets the default triggers. - /// </summary> - /// <returns>IEnumerable{BaseTaskTrigger}.</returns> - protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers() - { - var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(0) }; //12am - - return new[] { trigger }; - } - - /// <summary> - /// Executes the internal. - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> - protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress) - { - cancellationToken.ThrowIfCancellationRequested(); - - progress.Report(0); - - return Task.Run(() => Kernel.ReloadLogger()); - } - - /// <summary> - /// Gets the name. - /// </summary> - /// <value>The name.</value> - public override string Name - { - get { return "Start new log file"; } - } - - /// <summary> - /// Gets the description. - /// </summary> - /// <value>The description.</value> - public override string Description - { - get { return "Moves logging to a new file to help reduce log file sizes."; } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs deleted file mode 100644 index f02293a5e..000000000 --- a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs +++ /dev/null @@ -1,121 +0,0 @@ -using MediaBrowser.Common.Kernel; -using MediaBrowser.Model.Logging; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Common.ScheduledTasks.Tasks -{ - /// <summary> - /// Plugin Update Task - /// </summary> - public class SystemUpdateTask : BaseScheduledTask<IKernel> - { - /// <summary> - /// The _app host - /// </summary> - private readonly IApplicationHost _appHost; - - /// <summary> - /// Initializes a new instance of the <see cref="SystemUpdateTask" /> class. - /// </summary> - /// <param name="appHost">The app host.</param> - /// <param name="taskManager">The task manager.</param> - /// <param name="kernel">The kernel.</param> - /// <param name="logger">The logger.</param> - public SystemUpdateTask(IApplicationHost appHost, ITaskManager taskManager, IKernel kernel, ILogger logger) - : base(kernel, taskManager, logger) - { - _appHost = appHost; - } - - /// <summary> - /// Creates the triggers that define when the task will run - /// </summary> - /// <returns>IEnumerable{BaseTaskTrigger}.</returns> - protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers() - { - return new BaseTaskTrigger[] { - - // 1am - new DailyTrigger { TimeOfDay = TimeSpan.FromHours(1) }, - - new IntervalTrigger { Interval = TimeSpan.FromHours(2)} - }; - } - - /// <summary> - /// Returns the task to be executed - /// </summary> - /// <param name="cancellationToken">The cancellation token.</param> - /// <param name="progress">The progress.</param> - /// <returns>Task.</returns> - protected override async Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress) - { - if (!_appHost.CanSelfUpdate) return; - - EventHandler<double> innerProgressHandler = (sender, e) => progress.Report(e * .1); - - // Create a progress object for the update check - var innerProgress = new Progress<double>(); - innerProgress.ProgressChanged += innerProgressHandler; - - var updateInfo = await _appHost.CheckForApplicationUpdate(cancellationToken, innerProgress).ConfigureAwait(false); - - // Release the event handler - innerProgress.ProgressChanged -= innerProgressHandler; - - progress.Report(10); - - if (!updateInfo.IsUpdateAvailable) - { - progress.Report(100); - return; - } - - cancellationToken.ThrowIfCancellationRequested(); - - if (Kernel.Configuration.EnableAutoUpdate) - { - Logger.Info("Update Revision {0} available. Updating...", updateInfo.AvailableVersion); - - innerProgressHandler = (sender, e) => progress.Report((e * .9) + .1); - - innerProgress = new Progress<double>(); - innerProgress.ProgressChanged += innerProgressHandler; - - await _appHost.UpdateApplication(cancellationToken, innerProgress).ConfigureAwait(false); - - // Release the event handler - innerProgress.ProgressChanged -= innerProgressHandler; - - Kernel.OnApplicationUpdated(updateInfo.AvailableVersion); - } - else - { - Logger.Info("A new version of Media Browser is available."); - } - - progress.Report(100); - } - - /// <summary> - /// Gets the name of the task - /// </summary> - /// <value>The name.</value> - public override string Name - { - get { return "Check for application updates"; } - } - - /// <summary> - /// Gets the description. - /// </summary> - /// <value>The description.</value> - public override string Description - { - get { return "Downloads and installs application updates."; } - } - } -} diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs index afeacc2b3..cfb3f1fab 100644 --- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs +++ b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs @@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Represents a task trigger that fires on a weekly basis /// </summary> - public class WeeklyTrigger : BaseTaskTrigger + public class WeeklyTrigger : ITaskTrigger { /// <summary> /// Get the time of day to trigger the task to run @@ -30,7 +30,7 @@ namespace MediaBrowser.Common.ScheduledTasks /// Stars waiting for the trigger action /// </summary> /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param> - protected internal override void Start(bool isApplicationStartup) + public void Start(bool isApplicationStartup) { DisposeTimer(); @@ -69,33 +69,35 @@ namespace MediaBrowser.Common.ScheduledTasks /// <summary> /// Stops waiting for the trigger action /// </summary> - protected internal override void Stop() + public void Stop() { DisposeTimer(); } /// <summary> - /// Disposes this instance. + /// Disposes the timer. /// </summary> - /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> - protected override void Dispose(bool dispose) + private void DisposeTimer() { - if (dispose) + if (Timer != null) { - DisposeTimer(); + Timer.Dispose(); } - - base.Dispose(dispose); } /// <summary> - /// Disposes the timer. + /// Occurs when [triggered]. /// </summary> - private void DisposeTimer() + public event EventHandler<EventArgs> Triggered; + + /// <summary> + /// Called when [triggered]. + /// </summary> + private void OnTriggered() { - if (Timer != null) + if (Triggered != null) { - Timer.Dispose(); + Triggered(this, EventArgs.Empty); } } } |
