private void HandleTaskException(TaskMetaData taskMetaData, Exception ex) { taskMetaData.FailureCounter++; string logMessage = "The '" + taskMetaData.InstanceName + "' instance of '" + taskMetaData.Task.Name + "' threw an exception. Attempt number " + taskMetaData.FailureCounter + ". Exception details: \r\n" + ex; if (taskMetaData.FailureCounter >= TASK_FAILURE_LIMIT) { PutTaskIntoCooldown(taskMetaData); taskMetaData.FailureCounter = 0; logMessage = "Going into Cooldown, will resume at " + taskMetaData.CooldownPoint + ". " + logMessage; } WriteErrorToLog(logMessage); }
private void PutTaskIntoCooldown(TaskMetaData taskMetaData) { taskMetaData.CooldownPoint = DateTime.Now + new TimeSpan(0, 0, TASK_FAILURE_COOLDOWN_INTERVAL_S); }
private bool TaskIsDueToDispatch(TaskMetaData taskMetaData, DateTime currentTime) { bool isInCooldownMode = taskMetaData.CooldownPoint > currentTime; DateTime nextDispatchTime = taskMetaData.LastDispatch + taskMetaData.Task.Interval; bool hasNotPassedDueTime = nextDispatchTime > currentTime; if (taskMetaData.Task == null || taskMetaData.IsRunning || isInCooldownMode || hasNotPassedDueTime) { return false; } return true; }