Skip to content

Commit a5a8d18

Browse files
committed
Use TaskKey object to simplify api cognitive load
1 parent 8fcf018 commit a5a8d18

6 files changed

Lines changed: 98 additions & 34 deletions

File tree

Gofer.NET.Tests/GivenARecurringTask.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public class GivenARecurringTask
1515
[Fact]
1616
public void ItPersistsPropertiesWhenSerializedAndDeserialized()
1717
{
18-
var taskKey = $"{nameof(ItPersistsPropertiesWhenSerializedAndDeserialized)}::{Guid.NewGuid().ToString()}";
18+
var taskKey =
19+
new TaskKey($"{nameof(ItPersistsPropertiesWhenSerializedAndDeserialized)}::{Guid.NewGuid().ToString()}");
1920

2021
var testTask = GetTestTask(() =>
2122
Console.WriteLine(nameof(ItPersistsPropertiesWhenSerializedAndDeserialized)));
@@ -43,7 +44,7 @@ public void ItProperlyDeterminesEquivalence()
4344
var taskInfo1 = GetTestTask(() => TestMethod1("hello world"));
4445
var taskInfo2 = GetTestTask(() => TestMethod2());
4546

46-
var taskKey = $"{nameof(ItPersistsPropertiesWhenSerializedAndDeserialized)}::{Guid.NewGuid().ToString()}";
47+
var taskKey = new TaskKey($"{nameof(ItPersistsPropertiesWhenSerializedAndDeserialized)}::{Guid.NewGuid().ToString()}");
4748

4849
new RecurringTask(taskInfo1, TimeSpan.FromMinutes(5), taskKey)
4950
.IsEquivalent(new RecurringTask(taskInfo1, TimeSpan.FromMinutes(5), taskKey))
@@ -71,7 +72,7 @@ public void ItProperlyDeterminesEquivalence()
7172

7273
Action differentIdsThrow = () =>
7374
new RecurringTask(taskInfo1, TimeSpan.FromMinutes(5), taskKey)
74-
.IsEquivalent(new RecurringTask(taskInfo1, TimeSpan.FromMinutes(5), "anothertaskkey"));
75+
.IsEquivalent(new RecurringTask(taskInfo1, TimeSpan.FromMinutes(5), new TaskKey("anothertaskkey")));
7576

7677
differentIdsThrow.ShouldThrow<Exception>();
7778
}

Gofer.NET.Tests/GivenATaskScheduler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public async Task ItDoesNotBlowUpWhenCancelingNonExistentTasks()
244244
var taskQueue = TaskQueueTestFixture.UniqueRedisTaskQueue();
245245
var taskScheduler = new TaskScheduler(taskQueue);
246246

247-
(await taskScheduler.CancelTask("hello")).Should().BeFalse();
247+
(await taskScheduler.CancelTask(new TaskKey("hello"))).Should().BeFalse();
248248
}
249249

250250
[Fact]

RecurringTask.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class RecurringTask
1212
public string LockKey => $"{nameof(RecurringTask)}::{TaskKey}::ScheduleLock";
1313

1414
[JsonProperty]
15-
public string TaskKey { get; private set; }
15+
public TaskKey TaskKey { get; private set; }
1616

1717
[JsonProperty]
1818
public DateTime StartTime { get; private set; }
@@ -34,7 +34,7 @@ public RecurringTask() { }
3434
public RecurringTask(
3535
TaskInfo taskInfo,
3636
TimeSpan interval,
37-
string taskKey) : this(taskInfo, taskKey)
37+
TaskKey taskKey) : this(taskInfo, taskKey)
3838
{
3939
Interval = interval;
4040

@@ -44,15 +44,15 @@ public RecurringTask(
4444
public RecurringTask(
4545
TaskInfo taskInfo,
4646
string crontab,
47-
string taskKey) : this(taskInfo, taskKey)
47+
TaskKey taskKey) : this(taskInfo, taskKey)
4848
{
4949
ValidateCrontab(crontab);
5050
Crontab = crontab;
5151

5252
FirstRunTime = GetNextRunTime(DateTime.UtcNow);
5353
}
5454

55-
private RecurringTask(TaskInfo taskInfo, string taskKey)
55+
private RecurringTask(TaskInfo taskInfo, TaskKey taskKey)
5656
{
5757
TaskInfo = taskInfo;
5858
StartTime = DateTime.UtcNow;

ScheduledTask.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class ScheduledTask
1212
public string LockKey => $"{nameof(ScheduledTask)}::{TaskKey}::ScheduleLock";
1313

1414
[JsonProperty]
15-
public string TaskKey { get; private set; }
15+
public TaskKey TaskKey { get; private set; }
1616

1717
[JsonProperty]
1818
public long ScheduledUnixTimeMilliseconds { get; private set; }
@@ -25,22 +25,22 @@ public ScheduledTask() { }
2525
public ScheduledTask(
2626
TaskInfo taskInfo,
2727
TimeSpan offset,
28-
string taskKey) : this(taskInfo, new DateTimeOffset(DateTime.UtcNow + offset), taskKey)
28+
TaskKey taskKey) : this(taskInfo, new DateTimeOffset(DateTime.UtcNow + offset), taskKey)
2929
{
3030
}
3131

3232
public ScheduledTask(
3333
TaskInfo taskInfo,
3434
DateTime scheduledTime,
3535
TaskQueue taskQueue,
36-
string taskKey) : this(taskInfo, new DateTimeOffset(scheduledTime), taskKey)
36+
TaskKey taskKey) : this(taskInfo, new DateTimeOffset(scheduledTime), taskKey)
3737
{
3838
}
3939

4040
public ScheduledTask(
4141
TaskInfo taskInfo,
4242
DateTimeOffset scheduledDateTimeOffset,
43-
string taskKey)
43+
TaskKey taskKey)
4444
{
4545
TaskKey = taskKey;
4646
TaskInfo = taskInfo;

TaskKey.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System;
2+
3+
namespace Gofer.NET
4+
{
5+
public class TaskKey
6+
{
7+
public string Value { get; set; }
8+
9+
public string RecurringTaskName { get; set; }
10+
11+
public static TaskKey CreateUnique()
12+
{
13+
return new TaskKey($"{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}::{Guid.NewGuid().ToString()}");
14+
}
15+
16+
public static TaskKey CreateRecurring(string recurringTaskName)
17+
{
18+
return new TaskKey($"Recurring{nameof(TaskKey)}::{recurringTaskName}", recurringTaskName);
19+
}
20+
21+
public TaskKey(string value)
22+
{
23+
Value = value;
24+
RecurringTaskName = null;
25+
}
26+
27+
public TaskKey(string value, string recurringTaskName)
28+
{
29+
Value = value;
30+
RecurringTaskName = recurringTaskName;
31+
}
32+
33+
public override bool Equals(object obj)
34+
{
35+
if (obj == null || GetType() != obj.GetType())
36+
{
37+
return false;
38+
}
39+
40+
return string.Equals(Value, ((TaskKey) obj).Value);
41+
}
42+
43+
public override int GetHashCode()
44+
{
45+
return Value.GetHashCode();
46+
}
47+
48+
public override string ToString()
49+
{
50+
return Value;
51+
}
52+
}
53+
}

TaskScheduler.cs

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public async Task Tick(bool forceRunPromotion=false)
6969

7070
public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, TimeSpan offsetFromNow)
7171
{
72-
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), offsetFromNow, UniqueTaskKey());
72+
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), offsetFromNow, TaskKey.CreateUnique());
7373

7474
await EnqueueScheduledTask(scheduledTask);
7575

@@ -78,7 +78,7 @@ public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, Tim
7878

7979
public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, DateTimeOffset scheduledTime)
8080
{
81-
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), scheduledTime, UniqueTaskKey());
81+
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), scheduledTime, TaskKey.CreateUnique());
8282

8383
await EnqueueScheduledTask(scheduledTask);
8484

@@ -87,7 +87,7 @@ public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, Dat
8787

8888
public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, DateTime scheduledTime)
8989
{
90-
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), scheduledTime, UniqueTaskKey());
90+
var scheduledTask = new ScheduledTask(action.ToTaskInfo(), scheduledTime, TaskKey.CreateUnique());
9191

9292
await EnqueueScheduledTask(scheduledTask);
9393

@@ -96,7 +96,8 @@ public async Task<ScheduledTask> AddScheduledTask(Expression<Action> action, Dat
9696

9797
public async Task<RecurringTask> AddRecurringTask(Expression<Action> action, TimeSpan interval, string taskName)
9898
{
99-
var recurringTask = new RecurringTask(action.ToTaskInfo(), interval, RecurringTaskKey(taskName));
99+
var recurringTask = new RecurringTask(action.ToTaskInfo(), interval,
100+
TaskKey.CreateRecurring(taskName));
100101

101102
if (await RecurringTaskDoesNotExistOrNeedsChange(recurringTask))
102103
{
@@ -109,7 +110,8 @@ public async Task<RecurringTask> AddRecurringTask(Expression<Action> action, Tim
109110

110111
public async Task<RecurringTask> AddRecurringTask(Expression<Action> action, string crontab, string taskName)
111112
{
112-
var recurringTask = new RecurringTask(action.ToTaskInfo(), crontab, RecurringTaskKey(taskName));
113+
var recurringTask = new RecurringTask(action.ToTaskInfo(), crontab,
114+
TaskKey.CreateRecurring(taskName));
113115

114116
if (await RecurringTaskDoesNotExistOrNeedsChange(recurringTask))
115117
{
@@ -124,12 +126,17 @@ public async Task<bool> CancelRecurringTask(RecurringTask recurringTask)
124126
return await CancelTask(recurringTask.TaskKey);
125127
}
126128

129+
public async Task<bool> CancelRecurringTask(string taskName)
130+
{
131+
return await CancelTask(TaskKey.CreateRecurring(taskName));
132+
}
133+
127134
public async Task<bool> CancelScheduledTask(ScheduledTask scheduledTask)
128135
{
129136
return await CancelTask(scheduledTask.TaskKey);
130137
}
131138

132-
public async Task<bool> CancelTask(string taskKey)
139+
public async Task<bool> CancelTask(TaskKey taskKey)
133140
{
134141
if (LoadedCancelTaskScript == null)
135142
{
@@ -142,12 +149,25 @@ public async Task<bool> CancelTask(string taskKey)
142149
(RedisKey) ScheduledTasksMapKey,
143150
},
144151
new [] {
145-
(RedisValue) taskKey
152+
(RedisValue) taskKey.Value
146153
});
147154

148155
return (bool) didCancel;
149156
}
150157

158+
public async Task<RecurringTask> GetRecurringTask(TaskKey taskKey)
159+
{
160+
var serializedRecurringTask = await _taskQueue.Backend.GetMapField(ScheduledTasksMapKey,
161+
$"serializedRecurringTask::{taskKey.Value}");
162+
163+
if (string.IsNullOrEmpty(serializedRecurringTask))
164+
return null;
165+
166+
var recurringTask = JsonTaskInfoSerializer.Deserialize<RecurringTask>(serializedRecurringTask);
167+
168+
return recurringTask;
169+
}
170+
151171
public async Task<RecurringTask> GetRecurringTask(string taskKey)
152172
{
153173
var serializedRecurringTask = await _taskQueue.Backend.GetMapField(ScheduledTasksMapKey,
@@ -198,7 +218,7 @@ private async Task EnqueueRecurringTask(RecurringTask recurringTask)
198218
{
199219
var serializedTaskInfo = JsonTaskInfoSerializer.Serialize(recurringTask.TaskInfo);
200220
await _taskQueue.Backend.SetMapFields(ScheduledTasksMapKey,
201-
(recurringTask.TaskKey, serializedTaskInfo),
221+
(recurringTask.TaskKey.Value, serializedTaskInfo),
202222
($"isRecurring::{recurringTask.TaskKey}", true),
203223
($"serializedRecurringTask::{recurringTask.TaskKey}", JsonTaskInfoSerializer.Serialize(recurringTask)));
204224

@@ -207,21 +227,21 @@ await _taskQueue.Backend.SetMapFields(ScheduledTasksMapKey,
207227
await _taskQueue.Backend.AddToOrderedSet(
208228
ScheduledTasksOrderedSetKey,
209229
nextRunTimestamp,
210-
recurringTask.TaskKey);
230+
recurringTask.TaskKey.Value);
211231
}
212232

213233
private async Task EnqueueScheduledTask(ScheduledTask scheduledTask)
214234
{
215235
var serializedTaskInfo = JsonTaskInfoSerializer.Serialize(scheduledTask.TaskInfo);
216236

217237
await _taskQueue.Backend.SetMapFields(ScheduledTasksMapKey,
218-
(scheduledTask.TaskKey, serializedTaskInfo),
238+
(scheduledTask.TaskKey.Value, serializedTaskInfo),
219239
($"isRecurring::{scheduledTask.TaskKey}", false));
220240

221241
await _taskQueue.Backend.AddToOrderedSet(
222242
ScheduledTasksOrderedSetKey,
223243
scheduledTask.ScheduledUnixTimeMilliseconds,
224-
scheduledTask.TaskKey);
244+
scheduledTask.TaskKey.Value);
225245
}
226246

227247
private async Task RescheduleRecurringTasks()
@@ -251,7 +271,7 @@ private async Task RescheduleRecurringTasks()
251271
recurringTask = JsonTaskInfoSerializer.Deserialize<RecurringTask>(serializedRecurringTask);
252272
nextRunTimestamp = recurringTask.GetNextRunTimestamp(DateTime.UtcNow);
253273

254-
args.Add((RedisValue) recurringTask.TaskKey);
274+
args.Add((RedisValue) recurringTask.TaskKey.Value);
255275
args.Add((RedisValue) nextRunTimestamp);
256276
}
257277

@@ -362,15 +382,5 @@ private string LuaScriptToCancelTask()
362382
return false
363383
";
364384
}
365-
366-
private string UniqueTaskKey()
367-
{
368-
return $"{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}::{Guid.NewGuid().ToString()}";
369-
}
370-
371-
private string RecurringTaskKey(string taskName)
372-
{
373-
return $"{nameof(RecurringTaskKey)}::{taskName}";
374-
}
375385
}
376386
}

0 commit comments

Comments
 (0)