-
-
Notifications
You must be signed in to change notification settings - Fork 307
Expand file tree
/
Copy pathActivityTracker.cs
More file actions
112 lines (95 loc) · 3.39 KB
/
ActivityTracker.cs
File metadata and controls
112 lines (95 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System.Collections.Concurrent;
namespace Wolverine.RoutingSlip.Tests;
internal static class ActivityTracker
{
private static readonly ConcurrentDictionary<Guid, List<ActivityExecutionRecord>> Executions = new();
private static readonly ConcurrentDictionary<Guid, List<ActivityCompensationRecord>> Compensations = new();
private static readonly ConcurrentDictionary<Guid, List<ExceptionInfo>> ActivityFaults = new();
private static readonly ConcurrentDictionary<Guid, List<ExceptionInfo>> CompensationFailures = new();
public static void RecordExecution(Guid trackingNumber, string activityName, Uri destination)
{
var records = Executions.GetOrAdd(trackingNumber, _ => []);
lock (records)
{
var attempt = records.Count(r => r.ActivityName == activityName) + 1;
records.Add(new ActivityExecutionRecord(activityName, destination, attempt));
}
}
public static void RecordCompensation(Guid trackingNumber, string activityName, Uri destination)
{
var records = Compensations.GetOrAdd(trackingNumber, _ => []);
lock (records)
{
records.Add(new ActivityCompensationRecord(activityName, destination));
}
}
public static IReadOnlyList<ActivityExecutionRecord> GetExecutions(Guid trackingNumber)
{
if (!Executions.TryGetValue(trackingNumber, out var records))
{
return Array.Empty<ActivityExecutionRecord>();
}
lock (records)
{
return records.ToList();
}
}
public static IReadOnlyList<ActivityCompensationRecord> GetCompensations(Guid trackingNumber)
{
if (!Compensations.TryGetValue(trackingNumber, out var records))
{
return Array.Empty<ActivityCompensationRecord>();
}
lock (records)
{
return records.ToList();
}
}
public static void RecordActivityFault(Guid trackingNumber, ExceptionInfo exceptionInfo)
{
var records = ActivityFaults.GetOrAdd(trackingNumber, _ => []);
lock (records)
{
records.Add(exceptionInfo);
}
}
public static void RecordCompensationFailure(Guid trackingNumber, ExceptionInfo exceptionInfo)
{
var records = CompensationFailures.GetOrAdd(trackingNumber, _ => []);
lock (records)
{
records.Add(exceptionInfo);
}
}
public static IReadOnlyList<ExceptionInfo> GetActivityFaults(Guid trackingNumber)
{
if (!ActivityFaults.TryGetValue(trackingNumber, out var records))
{
return Array.Empty<ExceptionInfo>();
}
lock (records)
{
return records.ToList();
}
}
public static IReadOnlyList<ExceptionInfo> GetCompensationFailures(Guid trackingNumber)
{
if (!CompensationFailures.TryGetValue(trackingNumber, out var records))
{
return Array.Empty<ExceptionInfo>();
}
lock (records)
{
return records.ToList();
}
}
public static void Reset()
{
Executions.Clear();
Compensations.Clear();
ActivityFaults.Clear();
CompensationFailures.Clear();
}
}
internal record ActivityExecutionRecord(string ActivityName, Uri Destination, int Attempt);
internal record ActivityCompensationRecord(string ActivityName, Uri Destination);