Skip to content

Commit 9e1396f

Browse files
committed
version 2.0.0: names changed, OnBeforeRun/OnAfterRun methods
1 parent 185c817 commit 9e1396f

File tree

8 files changed

+86
-39
lines changed

8 files changed

+86
-39
lines changed

README.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ Written for **ASP.NET vNext** (ASP.NET 5, ASP.NET Core 1).
1111
## Main features
1212

1313
* Start and Stop you task at any time;
14-
* First run (after Start) is delayed at random value (10-30 sec, customizable) to prevent app delay during statup;
14+
* First run (after Start) is delayed at random value (10-30 sec, customizable) to prevent app freeze during statup;
1515
* Run "immediately" (without waiting for next scheduled time);
1616
* Change run interval while running;
17-
* Task `Status` property (extendable) contains:
17+
* `RunStatus` property (extendable) contains:
1818
* last/next run times;
1919
* last run result (success / exception);
2020
* last success run time;
@@ -25,15 +25,15 @@ Written for **ASP.NET vNext** (ASP.NET 5, ASP.NET Core 1).
2525

2626
### 1. Create new task class
2727

28-
public class MyFirstTask : TaskBase<TaskStatus>
28+
public class MyFirstTask : TaskBase<TaskRunStatus>
2929
{
3030
public MyFirstTask(ILoggerFactory loggerFactory, IServiceScopeFactory serviceScopeFactory)
3131
: base(loggerFactory, TimeSpan.FromMinutes(5), serviceScopeFactory)
3232
{
3333
// Nothing
3434
}
3535

36-
protected override void Run(IServiceProvider serviceProvider, TaskStatus state)
36+
protected override void Run(IServiceProvider serviceProvider, TaskRunStatus runStatus)
3737
{
3838
// Place your code here
3939
}
@@ -61,3 +61,16 @@ And viola! Your task will run every 5 minutes (second param when calling :base c
6161
## Installation
6262

6363
Use NuGet package [RecurrentTasks](https://www.nuget.org/packages/RecurrentTasks/)
64+
65+
### Dependencies
66+
67+
* Microsoft.Extensions.Logging.Abstractions
68+
* Microsoft.Extensions.DependencyInjection.Abstractions
69+
70+
## Version history
71+
72+
* 2.0.0 (Feb 5, 2016)
73+
* Class/method/property names changed. Incompatible update - major version bump.
74+
* New overridable methods `OnBeforeRun`, `OnAfterRunSuccess`, `OnAfterRunFail`
75+
* 1.0.0 (Feb 4, 2016)
76+
* Initial release - our internal classes goes opensource

sample/RecurrentTasks.Sample/SampleTask.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Microsoft.Extensions.DependencyInjection;
66
using Microsoft.Extensions.Logging;
77

8-
public class SampleTask : TaskBase<TaskStatus>
8+
public class SampleTask : TaskBase<TaskRunStatus>
99
{
1010
public List<string> Messages { get; } = new List<string>();
1111

@@ -15,7 +15,7 @@ public SampleTask(ILoggerFactory loggerFactory, IServiceScopeFactory serviceScop
1515
// Nothing
1616
}
1717

18-
protected override void Run(IServiceProvider serviceProvider, TaskStatus state)
18+
protected override void Run(IServiceProvider serviceProvider, TaskRunStatus runStatus)
1919
{
2020
Messages.Add(string.Format("Run at: {0}", DateTimeOffset.Now));
2121
}

sample/RecurrentTasks.Sample/Views/Home/Index.cshtml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
<dt>IsStarted</dt>
77
<dd>@myTask.IsStarted</dd>
88

9-
<dt>Status.LastRunResult</dt>
10-
<dd>@myTask.Status.LastRunResult</dd>
9+
<dt>RunStatus.LastResult</dt>
10+
<dd>@myTask.RunStatus.LastResult</dd>
1111

12-
<dt>Status.LastRunTime</dt>
13-
<dd>@myTask.Status.LastRunTime</dd>
12+
<dt>RunStatus.LastRunTime</dt>
13+
<dd>@myTask.RunStatus.LastRunTime</dd>
1414

15-
<dt>Status.NextRunTime</dt>
16-
<dd>@myTask.Status.NextRunTime (in @(myTask.Status.NextRunTime.Subtract(DateTime.Now)))</dd>
15+
<dt>RunStatus.NextRunTime</dt>
16+
<dd>@myTask.RunStatus.NextRunTime (in @(myTask.RunStatus.NextRunTime.Subtract(DateTime.Now)))</dd>
1717
</dl>
1818

1919
<form method="post">

src/RecurrentTasks/ITask.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface ITask
2727
/// <summary>
2828
/// Information about task result (last run time, last exception, etc)
2929
/// </summary>
30-
TaskStatus Status { get; }
30+
TaskRunStatus RunStatus { get; }
3131

3232
/// <summary>
3333
/// Interval between runs

src/RecurrentTasks/TaskBase.cs

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using Microsoft.Extensions.Logging;
88
using Microsoft.Extensions.DependencyInjection;
99

10-
public abstract class TaskBase<TState> : ITask where TState : TaskStatus, new()
10+
public abstract class TaskBase<TRunStatus> : ITask where TRunStatus : TaskRunStatus, new()
1111
{
1212
private static readonly Random Random = new Random();
1313

@@ -25,12 +25,12 @@ public TaskBase(ILoggerFactory loggerFactory, TimeSpan interval, IServiceScopeFa
2525
Logger = loggerFactory.CreateLogger(this.GetType().FullName);
2626
Interval = interval;
2727
ServiceScopeFactory = serviceScopeFactory;
28-
Status = new TState();
28+
RunStatus = new TRunStatus();
2929
}
3030

31-
TaskStatus ITask.Status { get { return Status; } }
31+
TaskRunStatus ITask.RunStatus { get { return RunStatus; } }
3232

33-
public TState Status { get; private set; }
33+
public TRunStatus RunStatus { get; protected set; }
3434

3535
public bool IsStarted
3636
{
@@ -96,11 +96,11 @@ protected void MainLoop(TimeSpan initialTimeout)
9696
while (true)
9797
{
9898
Logger.LogDebug("Sleeping for {0}...", sleepInterval);
99-
Status.NextRunTime = DateTimeOffset.Now.Add(sleepInterval);
99+
RunStatus.NextRunTime = DateTimeOffset.Now.Add(sleepInterval);
100100
var signaled = WaitHandle.WaitAny(events, sleepInterval);
101-
if (signaled == 0) // индекс сработавшего. нулевой это breakEvent
101+
if (signaled == 0) // index of signalled. zero is for 'breakEvent'
102102
{
103-
// значит закругляемся
103+
// must stop and quit
104104
Logger.LogWarning("BreakEvent is set, stopping...");
105105
mainTask = null;
106106
break;
@@ -122,29 +122,38 @@ protected void MainLoop(TimeSpan initialTimeout)
122122

123123
try
124124
{
125+
OnBeforeRun();
126+
125127
IsRunningRightNow = true;
126128

127-
Status.LastRunTime = DateTimeOffset.Now;
129+
RunStatus.LastRunTime = DateTimeOffset.Now;
128130

129131
Logger.LogInformation("Calling Run()...");
130-
Run(scope.ServiceProvider, Status);
132+
Run(scope.ServiceProvider, RunStatus);
131133
Logger.LogInformation("Done.");
132134

133-
Status.LastRunResult = TaskRunResult.Success;
134-
Status.LastSuccessTime = DateTimeOffset.Now;
135-
Status.FirstFail = DateTimeOffset.MinValue;
136-
Status.FailsCount = 0;
135+
RunStatus.LastResult = TaskRunResult.Success;
136+
RunStatus.LastSuccessTime = DateTimeOffset.Now;
137+
RunStatus.FirstFailTime = DateTimeOffset.MinValue;
138+
RunStatus.FailsCount = 0;
139+
RunStatus.LastException = null;
140+
IsRunningRightNow = false;
141+
142+
OnAfterRunSuccess();
137143
}
138144
catch (Exception ex)
139145
{
140-
Logger.LogWarning("Ooops, error (ignoring):", ex);
141-
Status.LastRunResult = TaskRunResult.Fail;
142-
Status.LastException = ex;
143-
if (Status.FailsCount == 0)
146+
Logger.LogWarning("Ooops, error (ignoring, see RunStatus.LastException):", ex);
147+
RunStatus.LastResult = TaskRunResult.Fail;
148+
RunStatus.LastException = ex;
149+
if (RunStatus.FailsCount == 0)
144150
{
145-
Status.FirstFail = DateTimeOffset.Now;
151+
RunStatus.FirstFailTime = DateTimeOffset.Now;
146152
}
147-
Status.FailsCount++;
153+
RunStatus.FailsCount++;
154+
IsRunningRightNow = false;
155+
156+
OnAfterRunFail();
148157
}
149158
finally
150159
{
@@ -156,6 +165,30 @@ protected void MainLoop(TimeSpan initialTimeout)
156165
Logger.LogInformation("MainLoop() finished.");
157166
}
158167

159-
protected abstract void Run(IServiceProvider serviceProvider, TState state);
168+
protected abstract void Run(IServiceProvider serviceProvider, TRunStatus runStatus);
169+
170+
/// <summary>
171+
/// Called before Run() is called (even before IsRunningRightNow set to true)
172+
/// </summary>
173+
protected virtual void OnBeforeRun()
174+
{
175+
// nothing
176+
}
177+
178+
/// <summary>
179+
/// Called after Run() sucessfully finished (after IsRunningRightNow set to false)
180+
/// </summary>
181+
protected virtual void OnAfterRunSuccess()
182+
{
183+
// nothing
184+
}
185+
186+
/// <summary>
187+
/// Called after Run() falied (after IsRunningRightNow set to false)
188+
/// </summary>
189+
protected virtual void OnAfterRunFail()
190+
{
191+
// nothing
192+
}
160193
}
161194
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
{
33
using System;
44

5-
public class TaskStatus
5+
public class TaskRunStatus
66
{
7-
public TaskRunResult LastRunResult { get; set; }
7+
public TaskRunResult LastResult { get; set; }
88

99
public DateTimeOffset LastRunTime { get; set; }
1010

1111
public DateTimeOffset LastSuccessTime { get; set; }
1212

13-
public DateTimeOffset FirstFail { get; set; }
13+
public DateTimeOffset FirstFailTime { get; set; }
1414

1515
public int FailsCount { get; set; }
1616

src/RecurrentTasks/project.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
{
2-
"version": "1.0.0",
2+
"version": "2.0.0",
33
"title": "RecurrentTasks",
44
"description": "RecurrentTasks for .NET allows you to run simple recurrent background tasks with specific intervals, without complex frameworks, persistance, etc...",
55
"authors": [ "Dmitry Popov" ],
66
"tags": [ "task", "job", "recurrent", "recurring", "aspnetcore" ],
77
"projectUrl": "https://github.com/justdmitry/RecurrentTasks",
88
"copyright": "Dmitry Popov, 2016",
9+
"releaseNotes": "Renames in classes/methods/properties, OnBefore/OnAfterRun overridable methods",
910
"licenseUrl": "https://github.com/justdmitry/RecurrentTasks/blob/master/LICENSE",
1011
"repository": {
1112
"type": "git",

test/RecurrentTasks.Tests/SampleTask.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Microsoft.Extensions.Logging;
66
using Microsoft.Extensions.DependencyInjection;
77

8-
public class SampleTask : TaskBase<TaskStatus>
8+
public class SampleTask : TaskBase<TaskRunStatus>
99
{
1010
public readonly ManualResetEventSlim TaskRunCalled = new ManualResetEventSlim(false);
1111

@@ -19,7 +19,7 @@ public SampleTask(ILoggerFactory loggerFactory, TimeSpan interval, IServiceScope
1919
// Nothing
2020
}
2121

22-
protected override void Run(IServiceProvider serviceProvider, TaskStatus state)
22+
protected override void Run(IServiceProvider serviceProvider, TaskRunStatus runStatus)
2323
{
2424
TaskRunCalled.Set();
2525
if (MustThrowError)

0 commit comments

Comments
 (0)