forked from Geotab/mygeotab-api-adapter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPrerequisiteProcessorChecker.cs
60 lines (52 loc) · 3.18 KB
/
PrerequisiteProcessorChecker.cs
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
using MyGeotabAPIAdapter.Logging;
using NLog;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
namespace MyGeotabAPIAdapter.DataOptimizer
{
/// <summary>
/// A class that handles checking whether prerequisite processors are running.
/// </summary>
public class PrerequisiteProcessorChecker : IPrerequisiteProcessorChecker
{
readonly IMessageLogger messageLogger;
readonly IProcessorTracker processorTracker;
readonly Logger logger = LogManager.GetCurrentClassLogger();
/// <summary>
/// Initializes a new instance of the <see cref="PrerequisiteProcessorChecker"/> class.
/// </summary>
public PrerequisiteProcessorChecker(IMessageLogger messageLogger, IProcessorTracker processorTracker)
{
MethodBase methodBase = MethodBase.GetCurrentMethod();
logger.Trace($"Begin {methodBase.ReflectedType.Name}.{methodBase.Name}");
this.messageLogger = messageLogger;
this.processorTracker = processorTracker;
logger.Trace($"End {methodBase.ReflectedType.Name}.{methodBase.Name}");
}
/// <inheritdoc/>
public async Task WaitForPrerequisiteProcessorsIfNeededAsync(string dependentProcessorClassName, List<DataOptimizerProcessor> prerequisiteProcessors, CancellationToken cancellationToken)
{
MethodBase methodBase = MethodBase.GetCurrentMethod();
logger.Trace($"Begin {methodBase.ReflectedType.Name}.{methodBase.Name}");
// Perform initial check to see whether all prerequisite processors are running.
var prerequisiteProcessorOperationCheckResult = await processorTracker.CheckOperationOfPrerequisiteProcessors(prerequisiteProcessors);
var allPrerequisiteProcessorsRunning = prerequisiteProcessorOperationCheckResult.AllPrerequisiteProcessorsRunning;
// If all prerequisite processors are not running, keep checking until they are.
while (allPrerequisiteProcessorsRunning == false)
{
prerequisiteProcessorOperationCheckResult = await processorTracker.CheckOperationOfPrerequisiteProcessors(prerequisiteProcessors);
allPrerequisiteProcessorsRunning = prerequisiteProcessorOperationCheckResult.AllPrerequisiteProcessorsRunning;
if (allPrerequisiteProcessorsRunning == false)
{
messageLogger.LogWaitForPrerequisiteProcessorsServicePause(dependentProcessorClassName, prerequisiteProcessorOperationCheckResult.ProcessorsNeverRunStatement, prerequisiteProcessorOperationCheckResult.ProcessorsNotRunningStatement, prerequisiteProcessorOperationCheckResult.RecommendedDelayBeforeNextCheck);
await Task.Delay(prerequisiteProcessorOperationCheckResult.RecommendedDelayBeforeNextCheck, cancellationToken);
}
cancellationToken.ThrowIfCancellationRequested();
messageLogger.LogWaitForPrerequisiteProcessorsServiceResumption(dependentProcessorClassName);
}
logger.Trace($"End {methodBase.ReflectedType.Name}.{methodBase.Name}");
}
}
}